![了解 openssl s_client 的输出](https://linux22.com/image/631271/%E4%BA%86%E8%A7%A3%20openssl%20s_client%20%E7%9A%84%E8%BE%93%E5%87%BA.png)
自从我们的电子邮件提供商更改了 SSL 证书后,基于 mono 的 POP3 客户端就拒绝连接到其安全 POP 服务器来下载电子邮件。其他客户端没有问题;例如 Thunderbird 和 Outlook;大多数能够检查奇数端口的 SSL 检查器网站也没有问题,但这个。我一直在与这两家提供商合作,试图找出问题所在,但最终都陷入了困境,因为我对 SSL 证书了解不够多,无法指导任何一家提供商了解故障所在。
在调查过程中,我注意到以下两个命令的输出存在差异(为了便于阅读,我已从输出中删除了证书):
echo "" | openssl s_client -showcerts -connect pop.gmail.com:995
已连接(00000003) 深度=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 核实错误:num=20:无法获取本地颁发者证书 验证返回:0 --- 证书链 0 s:/C=US/ST=加利福尼亚/L=山景城/O=Google Inc/CN=pop.gmail.com i:/C=US/O=Google Inc/CN=Google 互联网管理局 G2 -----开始证书----- -----证书结束----- 1 s:/C=US/O=Google Inc/CN=Google 互联网管理局 G2 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA -----开始证书----- -----证书结束----- 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA i:/C=US/O=Equifax/OU=Equifax 安全证书颁发机构 -----开始证书----- -----证书结束----- --- 服务器证书 主题 =/C=US/ST=加利福尼亚/L=山景城/O=Google Inc/CN=pop.gmail.com 发行人=/C=US/O=Google Inc/CN=Google Internet Authority G2 --- 未发送客户端证书 CA 名称 --- SSL 握手已读取 3236 个字节并写入 435 个字节 --- 新的 TLSv1/SSLv3,密码为 RC4-SHA 服务器公钥为2048位 支持安全重新协商 压缩:无 扩展:无 SSL 会话: 协议:TLSv1 密码:RC4-SHA 会话 ID:745F84194498529B91B7D9194363CBBD23425446CF2BFF3BF5557E3C6606CA06 会话 ID-ctx: 主密钥:DED1AE0A44609F9D6F54626F4370ED96436A561A59F64D66240A277066322DCD2CCB9A6D198C95F4D2B0C7E6781EECD2 关键参数:无 开始时间:1397678434 超时:300(秒) 验证返回代码:20(无法获取本地颁发者证书) --- +OK Gpop 已准备好接收来自 69.3.61.10 c13mb42148040pdj 的请求 完毕
echo "" | openssl s_client -showcerts -connect secure.emailsrvr.com:995
已连接(00000003) 深度=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 核实错误:num=19:证书链中的自签名证书 验证返回:0 --- 证书链 0 s:/serialNumber=tG0GnsyAUkdX7DEo15ylNBjQJqAWZ/dD/OU=4159320284/OU=参见 www.rapidssl.com/resources/cps (c)14/OU=域控制验证 - RapidSSL(R)/CN=secure.emailsrvr.com 我:/C=US/O=GeoTrust,Inc./CN=RapidSSL CA -----开始证书----- -----证书结束----- 1 s:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA -----开始证书----- -----证书结束----- 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA -----开始证书----- -----证书结束----- --- 服务器证书 subject=/serialNumber=tG0GnsyAUkdX7DEo15ylNBjQJqAWZ/dD/OU=4159320284/OU=参见 www.rapidssl.com/resources/cps (c)14/OU=域控制验证 - RapidSSL(R)/CN=secure.emailsrvr.com 发行人=/C=US/O=GeoTrust, Inc./CN=RapidSSL CA --- 未发送客户端证书 CA 名称 --- SSL 握手已读取 3876 个字节并写入 319 个字节 --- 新的 TLSv1/SSLv3,密码为 DHE-RSA-AES256-SHA 服务器公钥为2048位 支持安全重新协商 压缩:无 扩展:无 SSL 会话: 协议:TLSv1 密码:DHE-RSA-AES256-SHA 会话 ID:3F4EE3992B46727BE2C7C3E76A9A6A8D64D66EE843CB1BB17A76AE2E030C7161 会话 ID-ctx: 主密钥:016209E50432EFE2359DB73AB527AF718152BFE6F88215A9CE40604E8FF2E2A3AC97A175F46DF737596866A8BC8E3F7F 关键参数:无 开始时间:1397678467 超时:300(秒) 验证返回代码:19(证书链中的自签名证书) --- 完毕
我一直在试图了解这是否有意义,因为当-CApath
提供该选项时,命令不会产生任何错误:
openssl s_client -CApath /etc/ssl/certs -showcerts -connect secure.emailsrvr.com:995
CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA
verify return:1
depth=0 serialNumber = tG0GnsyAUkdX7DEo15ylNBjQJqAWZ/dD, OU = 4159320284, OU = See www.rapidssl.com/resources/cps (c)14, OU = Domain Control Validated - RapidSSL(R), CN = secure.emailsrvr.com
verify return:1
...
openssl s_client -CApath /etc/ssl/certs -showcerts -connect pop.gmail.com:995
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = pop.gmail.com
verify return:1
...
-CAfile
下载后我也可以成功使用该选项CA文件证书直接来自 GeoTrust。
尽管如此,Fog Creek 似乎认为问题出在证书上,因为他们尝试将证书添加到 mono 的Trust
存储中但没有成功。我不同意他们的观点,但(如上所述)虽然大多数 SSL 检查器要么不检查端口 995,要么在尝试期间成功,但我发现这一页产生 SSL 错误 7。
我是否正确地解释了输出,意味着证书没有任何问题?
答案1
答案(正如本文所解释的security.SE帖子)是两者GeoTrust 全球 CA您在链中看到的证书实际上是不是同一个证书,一个源于另一个。
因为CA交叉签名!
当 GeoTrust Global CA 证书首次创建和签署时,没有任何计算机/浏览器/应用程序在其信任存储中拥有它。
有了其他CA(具有预先存在的信誉和分布)签署 GeoTrust 根 CA 证书,生成的证书(称为“桥接”证书)现在可以由第二个 CA 验证,而无需客户端明确信任 GeoTrust 根 CA 证书。
当 Google 提供 GeoTrust 根 CA 证书的交叉签名版本时,不信任原始证书的客户端可以使用 Equifax CA 证书来验证 GeoTrust - 因此 Equifax 充当一种“遗留”信任锚。
答案2
当我启用 ssl 检查时,fetchmail 也遇到了类似的问题pop.gmail.com
。
我下载了 Equifax pem 文件,但它无法正常工作,必须运行c_rehash ssl/certs
它才能创建带有哈希值的符号链接,然后它才能正常工作。
或者,也可以通过运行来知道哈希值...
openssl x509 -in Equifax_Secure_Certificate_Authority.pem -fingerprint -subject -issuer -serial -hash -noout | sed -n /^[0-9]/p
答案3
在生成和配置证书时,openssl.cnf
还应该更新文件(Debian - /etc/ssl/openssl.cnf
),以指示正确的路径、证书名称等,然后您可以运行命令并检查它们而无需-CApath
选项。
因此,在这种情况下,远程主机也可以正确检查您的证书。
以下是相应openssl.cnf
部分:
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
dir = /etc/ssl