centso7 openssl 报错Verify return code: 20 (unable to get local issuer certificate)

本文记录了解决CentOS7环境下因OpenSSL版本升级而导致的本地证书加载失败问题的过程。通过对线上环境与本地环境的对比分析,最终定位到证书路径配置缺失,并给出了具体的修复步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题重现: 

        由于centos7 默认的openssl的版本为1.1.0k,本人编译媒体服务时,需要openssl版本1.1.1以上,所有删除的之前的低版本openssl,手动编译了一个1.1.1k的版本,媒体服务正常运行,并且CA验证正常。

        结果昨天晚上服务器断电重启后,当我在获取电信MQ数据时,openssl一直报错,Unhandled exception. System.Security.Authentication.AuthenticationException:The remote certificate was rejected by the provided RemoteCertificateValidat

使用openssl的命令测试连接状态:

openssl s_client -connect msgpush.ctwing.cn:16651

得到以下结果:

        

 提示,无法加载本地证书。使用了各种方案,编译各种版本的openssl,还是不行。

百般无奈下,只能分析线上环境的openssl(线上为云服务器,openssl为1.02K)与本地服务器的openssl的区别,又经历了痛苦的几个小时。终于在查看openssl 版本的命令中,看出了端倪,这个命令很重要:

openssl version -d

        线上打印的结果:

        

 本地服务器的结果:

 进入线上环境openssl 的目录:执行命令

ll

显示结果:

关键点就这个目录,看我标红的部分,这里的软链接就是证书的位置

我们再来看,本地服务器

 可以看到,并没有看到证书的软链接,

所以一切的原因就是这里,没有告诉系统openssl使用的证书位置。所以我们创建一个软链接即可。

ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem cert.pem
 

执行结果如下:

当我们再次使用openssl的测试命令时:成功了,

场景2:

通过上面流程执行后发现依然验证失败。

使用命令

 openssl verify cert.pem

提示无法加载文件,找不到指定的文件。

首先我们看我们openssl的安装路径是不是在/usr/local/lib64 目录下,经过查看无此文件夹,文件被安装到了/usr/local/lib 目录下,这里我们首先需要将ld.so.cnf中的路径修改为/usr/local/lib 

再次使用命令验证依旧失败,无法加载证书

经过比对,使用tls-ca-bundle.pem 文件为空,这里可能生成证书的时候配置有问题

我们将其他服务器受信任的证书拷贝一份过来,验证成功。

其他命令

openssl version -a

基于net 5.0在centos 7上提示ssl握手失败的解决方案

修改文件  /etc/ssl/openssl.cnf

# Add this in the head of the file
openssl_conf = openssl_init

#
# skip
#

# And the following in the end of the file
[openssl_init]
ssl_conf = ssl_config

[ssl_config]
system_default = tls_defaults

[tls_defaults]
CipherString = @SECLEVEL=2:kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:-aDSS:-3DES:!DES:!RC4:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
Ciphersuites = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256
MinProtocol = TLSv1.2

问题链接:

.net 核心 - 互操作加密 OpenSslCryptographic异常:错误:14094410:SSL 例程:ssl3_read_bytes:sslv3 警报握手失败 - 堆栈溢出 (stackoverflow.com)

解决无法加载本地证书的参考文章:

How to Fix Unable to get Local Issuer Certificate - howtouselinux

要改变 OpenSSL 的版本,您需要使用 OpenSSL 命令行工具中的 s_client 子命令。具体步骤如下: 1. 打开终端或命令提示符窗口,输入以下命令并按回车键: ``` openssl s_client -connect <hostname>:<port> ``` 其中,<hostname> 是您要连接的主机名,<port> 是要连接的端口号。 2. 如果连接成功,您将看到一段 SSL 握手信息,其中包括 OpenSSL 的版本号。例如: ``` CONNECTED(00000003) depth=0 CN = www.example.com verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = www.example.com verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:/CN=www.example.com i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- Server certificate ... SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 ... Start Time: 1624261470 Timeout : 7200 (sec) Verify return code: 21 (unable to verify the first certificate) Extended master secret: yes ``` 在 SSL-Session 部分,您可以看到 Protocol 字段,它指示了当前使用的 SSL/TLS 协议版本,例如 TLSv1.2。 3. 要改变协议版本,您需要使用 -tls1、-tls1_1、-tls1_2 或 -tls1_3 参数来指定所需的版本。例如,要使用 TLS 1.3,您可以输入以下命令: ``` openssl s_client -connect <hostname>:<port> -tls1_3 ``` 然后,您将看到 SSL-Session 中的 Protocol 字段已经更改为 TLSv1.3。 注意,您需要确保服务器也支持所需的协议版本,否则连接将失败。同时,由于 OpenSSL 的版本可能会影响您的应用程序安全性,建议谨慎更改 OpenSSL 版本,仅在必要时使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破浪征程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值