首页 > 解决方案 > 新的 SSL 证书验证错误 - 根本原因是什么?

问题描述

我的应用程序使用 Close API ( https://developer.close.com/ ) 来存储用户数据。我们的测试环境现在在尝试写入时出现 SSL 错误:

Faraday::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (certificate has expired))

原因可能是什么?我阅读错误消息的第一个假设是关闭证书可能已过期。但这似乎不太可能 - 服务通常维护良好,我们在生产中没有任何问题。

我考虑的下一件事是,我们服务器上的证书存储可能已经过时了。这不会让我感到惊讶,因为服务器运行的是 Ubuntu 14,而其他人在那里遇到了问题。但是我们有多台配置相同的机器,只有一台给我们带来了麻烦。这可能是根本原因吗?

标签: sslopenssl

解决方案


重现:

$ openssl s_client -CApath /dev/null -showcerts -connect api.close.com:443 -servername api.close.com
CONNECTED(00000003)
depth=3 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0

问题原来是最近弃用了 DST 根证书。旧的根证书 (DST) 已于 9 月 30 日弃用,现在需要使用现代版本 (ISRG)。

测试服务器仍然安装了 DST 和 ISRG 证书,而所有其他机器只安装了 ISRG。我假设关于这个特定 API 的某些东西优先寻找 DST 证书并忽略 ISRG,除非它是唯一的。

解决方法:从中删除 DST 证书/usr/share/ca-certificates/mozilla并将 ISRG 保留在那里 - 尝试上面的 openssl 命令,现在它可以工作了。


推荐阅读