如何使用 OpenSSL 调试证书链?

如何使用 OpenSSL 调试证书链?

我对 OpenSSL 完全陌生,正在阅读有关 OpenSSL 编程以连接到服务器的教程:

www.rtfm.com/openssl-examples/part1.pdf
www.rtfm.com/openssl-examples/part2.pdf

不知何故,设置正确的证书比预想的要困难得多……:(

当我使用 openssl s_client 测试消息时:

openssl s_client -connect 123.456.789.0:666 -CAfile test.crt -debug

我收到错误消息

深度=2 C = GB,ST = 大曼彻斯特,L = 索尔福德,O = COMODO CA Limited,CN = COMODO RSA 认证机构验证错误:num=20:无法获取本地颁发者证书验证返回:0

进而:

错误:14094412:SSL 例程:SSL3_READ_BYTES:sslv3 警报错误证书:s3_pkt.c:1257:SSL 警报编号 42 140685406562208:错误:140790E5:SSL 例程:SSL23_WRITE:ssl 握手失败:s23_lib.c:177:

以下是证书链:

 Certificate chain  
 0 
   s:myself    
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA  
 1 
   s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA    
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority  
 2 
   s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority    
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

我已经尝试让系统识别这些证书正确几个小时了,但无济于事......

到目前为止我已经尝试过的:

  • 使用 update-ca-trust 将 COMODO 证书添加到受信任证书列表的各种变体。
  • 将证书添加到 /etc/ssl/certs 中的受信任证书列表中
  • 在文件夹中创建 pem 文件并使用 -CApath 添加它们。
  • 谷歌的问题是,大多数教程都是从服务器管理员的角度讨论这个问题,但我无权访问服务器。

操作系统是Fedora。

是否有一个结构化的方法来解决这个问题?


编辑:证书创建如下:

 openssl req -new -x509 -sha256 -days 365 -key mykey.key -out test.crt

答案1

确保包含所有中间证书并确保它们是最新的。如果test.crt实际上是一个仅包含的文件/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root,则这是正确的方法。您也可以包含根,大多数客户端都会接受此类链,但有些会阻塞。

一般来说,最佳做法是将从您的证书到根证书之前的最后一个证书都包含在内,以防客户端没有最后一个中间证书。

也可能test.crt包含除正确链之外的内容。默认情况下,OpenSSL 不进行部分链验证(在旧版本中,它根本不进行验证)。在此模式下运行时,它不关心 /etc/ssl/certs 中的内容。

或者,您可能出示了过期的中间证书。CA 通常会使用相同的密钥重新认证其中间证书;如果他们这样做,只需下载更新的中间 CA 证书并替换链中过期的证书即可。

最后,使用 openssl s_client,您需要指定它要验证的内容。例如,使用选项-CApath /etc/ssl/certs-CAfile your_ca.crt。对于第一个选项,请使用系统的信任存储,对于第二个选项,请指定根 CA 证书。

答案2

相互检查证书文件。

默认情况下,我们有 3 个文件(基于常规 CA 或自签名):

  • (私钥)
  • (公共)证书
  • (公共)证书颁发机构(链)文件<-包括所有中介机构

那么,密钥适合证书吗?证书适合 CA 吗?注释:虽然名称像 *.crt 或 *.key,但格式是 PEM

# (openssl x509 -noout -modulus \
  -in /path/to/server.crt | \
  openssl md5 ; openssl rsa  -noout -modulus \
  -in /path/to/server.key | openssl md5) | uniq

预期结果正好是 1 行,例如

(stdin)= a634dfd21796c72dcf8c809d3bacc966

如果您看到两行,则密钥和证书不匹配。

如果可以,继续

# openssl verify -CAfile /path/to/ca.crt /path/to/server.crt

你想看

server.crt: OK

如果两个步骤之一失败,建议您重新创建证书/密钥。如果两个步骤都正常,您就知道您必须在另一个地方搜索以消除障碍(权限、更改的 CA、一侧是否适用于 openssl,另一侧是否适用于 GNUTls,...)

相关内容