偶然地,我的 Dovecot 服务器 SSL 配置中的链文件末尾有一个已过期的中间证书。这是一个严重的问题,我的 Android 电子邮件客户端拒绝使用它,尽管 Apple Mail 允许它 (??!)。事实上,几个小时前才刚刚过期。openssl x509 -in ...
显示:
Serial Number:
13:ea:28:70:5b:f4:ec:ed:0c:36:63:09:80:61:43:36
Signature Algorithm: sha384WithRSAEncryption
Issuer: C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
Validity
Not Before: May 30 10:48:38 2000 GMT
Not After : May 30 10:48:38 2020 GMT
Subject: C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
但是这个命令:
openssl s_client -showcerts -verify_return_error -connect imap.example.com:993
无法标记问题(同时输出过期的证书!)。OpenSSL 包版本是:1.1.1g-1+ubuntu18.04.1+d
CONNECTED(00000003)
depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
verify return:1
depth=0 CN = imap.example.com
verify return:1
我如何创建 OpenSSL 验证测试来查找和标记此问题?我已经在网上搜索了相当多的内容,但没有找到任何可以解决公共链中几级到期问题的内容。最接近的问题是:为什么我的 SSL 证书在 Android 上不受信任?但这只处理了 4 个证书链中缺失的环节。我猜测 Apple Mail 接受该错误的原因是 MacOS 缓存了同一中间 CA 的未过期版本。
编辑
在服务器上,以下内容:
/usr/share/ca-certificates/mozilla/USERTrust_RSA_Certification_Authority.crt
现在是自签名的,因此 openssl 必须默默地替换这个(编辑:通过隐藏此证书进行测试;现在检测到过期!)但我的目标是足够敏感以检测到 Android 的投诉。我使用的是 Android 10,但比最新的更新晚了一个(5 月 4 日)。
答案1
归功于SSL伴侣感谢您的精彩解释。
基本上AddTrust 外部 CA 根证书现已超出要求,截至 2020 年 5 月 30 日,该证书刚刚过期。很可能其他CA 包中的证书可用于验证您拥有的主证书,但较旧的软件(OpenSSL 1.0 等)会失败,因为它选择了刚刚过期的证书链,而不是可以使用的证书链。解决方案是从证书文件中删除过期的证书,但您可能已经知道这一点。
但是,了解哪些地方存在漏洞是编写所需测试的关键 - 您需要将旧的易受攻击的 OpenSSL 版本包装在可以作为测试的一部分执行的内容中。我一直在 MacOS 上使用 curl,因为它拒绝使用链中的 AddTrust 证书来验证证书,但我们openssl
也看到命令行检测到它,不确定我们运行的到底是什么版本。
当然,如果您知道正是这个证书有问题,您可以通过其签名找到它:
openssl x509 -noout -fingerprint -in ../AddTrust\ External\ CA\ Root-2020.crt`
并将响应与
SHA1 Fingerprint=02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68
这是特定的错误证书。
我是希望这种特定的过期证书漏洞很少见,但如果您想进行更通用的测试,您需要寻找存在多个可能链的情况,并且一个有效而另一个无效。