HTTP3之QUICTLS报错: “unable to get local issuer certificate”

RMAG news

背景

最近使用QUICTLS整HTTP3时候,将自签证书加入到系统默认cert store,然后加载默认证书路径时总是报错:

“unable to get local issuer certificate”

QUICTLS在以前文章中介绍过。总的来说,就是为了让OpenSSL支持QUIC协议,基于OpenSSL仓库修改的仓库。系统原本安装了OpenSSL,通过编译QUICTLS后也安装了OpenSSL。注意依赖库时要分清楚使用哪个动态库

本文是在使用QUICTLS动态库时导致的问题,QUICTLS依赖库默认位于/usr/local/lib64,下面代码打印出证书相关默认目录。

// test.c
#include <stdio.h>
#include
<openssl/x509.h>

int main()
{
const char *file_path = X509_get_default_cert_file();
const char *dir_path = X509_get_default_cert_dir();
const char *file_env = X509_get_default_cert_file_env();
const char *file_env = X509_get_default_cert_dir_env();
printf(format: “file: %s, dir: %s, file_env: %s, dir_env: %sn,
file_path, dir_path, file_env, dir_env);

return 0;
}
// 打印原生OpenSSL相关证书地址
// gcc -o test test.c -lcrypto && ./test
// file: /usr/lib/ssl/cert.pem, dir: /usr/lib/ssl/certs, file_env: SSL_CERT_FILE, dir_env: SSL_CERT_DIR

// 打印QUICTLS相关证书地址
// gcc -o test test.c -L/usr/local/lib64 -lcrypto && ./test
// file: /usr/local/ssl/cert.pem, dir: /usr/local/ssl/certs, file_env: SSL_CERT_FILE, dir_env: SSL_CERT_DIR

根本原因

根本原因是因为使用quictls后, OpenSSL使用了新的配置目录/usr/local/ssl, 里面只有certs文件夹, 而且里面是空的。

是的,怎么也没有想到是这么回事,就这个问题整了好长时间!!!

在进行证书验证时候, 找不到最终的根证书(找得到才怪), 就会报错: “unable to get local issuer certificate”

解决办法

解决办法是跟原生的OpenSSL目录(/usr/lib/ssl)里面设置的一样就好。

QUICTLS_DIR=/usr/local/ssl
sudo rmdir $QUICTLS_DIR/certs”
sudo ln -s /etc/ssl/certs $QUICTLS_DIR/certs”

sudo rmdir $QUICTLS_DIR/private”
sudo ln -s /etc/ssl/private $QUICTLS_DIR/private”

sudo rm $QUICTLS_DIR/openssl.cnf”
sudo ln -s /etc/ssl/openssl.cnf $QUICTLS_DIR/openssl.cnf”

/usr/local/bin/openssl version -a # QUICTLS的各种配置
openssl version -a # 原生OpenSSL的各种地址, 特别是OPENSSLDIR

另外,openssl命令始终使用原生的, 因为原生是/usr/bin/openssl, QUICTLS的openssl命令位于/usr/local/bin/openssl。

Please follow and like us:
Pin Share