我对 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,...)