在 Mac High Sierra 10.13.5 上,我发现 TLS 认证验证存在差异。Chrome 和 Safari 在访问时对 TLS 验证很满意https://www.visitflorida.com。此外,curl 没有任何抱怨,而且我没有使用“-k”。但是,openssl 抱怨在尝试此操作时找不到中间证书openssl s_client -connect www.visitflorida.com:443 < /dev/null | openssl x509 -subject -noout
。我使用了基本 openssl 和 brew 安装的版本。
我尝试添加 -CAfile 中间.pem(我从 TrustWave 下载了中间证书)。尽管中间证书没有出现在我的 KeyChain 中的任何地方,但我已将我的 KeyChain 系统根导出到单个文件中,并通过 -CAfile 尝试了此操作。但没有任何效果。我看到证书的唯一文件系统位置是 /etc/ssl/cert.pem,当我通过 -CAfile 指定该位置时,它仍然失败。
有人说我的浏览器和 curl 对 TLS 验证的要求比 openssl 更宽松。真的是这样吗?我很难相信。有人能帮我解释一下这种行为吗?
顺便说一句,我知道可以通过在 www.visitflorida.com 的 TLS 端点上将中间证书与端点证书一起包含来解决这个问题。现在,如果我们能找到丢失的密钥文件就好了!
答案1
浏览器(例如 Internet Explorer/Edge、Chrome 和 Safari)将会查看 AIA 扩展的 caIssuer 字段以查找 URL,如果服务器在 TLS 握手期间未提供证书,则可从该 URL 下载上级 CA 的证书。
您的网站证书有一个 caIssuer 字段设置,http://ssl.trustwave.com/issuers/OVCA2_L1.crt
因此所有上述浏览器将从该 URL 下载它并使用它来构建链。
OpenSSL 等命令行工具s_client
不会使用 caIssuer 下载此附加证书,因此才会出现您看到的情况。如果您尝试使用 Mozilla Firefox,您也会注意到同样的情况,因为 Mozilla 拒绝使用此扩展。
caIssuer 字段最终掩盖了真正的问题,即糟糕的服务器管理。 RFC 5246 第 7.4.2 节规定服务器必须发送certificate_list
由其自己的证书和随后的任何中间 CA 证书组成的证书。