我目前在通过 NginX 反向代理为我们的邮件服务器设置客户端证书身份验证时遇到了一个棘手的问题。
该设置似乎在大多数情况下都可以在没有客户端证书的情况下正常工作。但是当我启用这些检查并运行测试时,openssl s_client
我总是得到:
Verify return code: 2 (unable to get issuer certificate)
我的nginx.conf的相关部分如下:
ssl on;
ssl_certificate /etc/ssl/certs/server_cert.pem;
ssl_certificate_key /etc/ssl/private/server_key.pem;
ssl_client_certificate /etc/ssl/certs/IntermediateCA_chain.crt;
ssl_crl /etc/ssl/crl.pem;
ssl_verify_client on;
文件中间CA_chain.crt是 PEM 格式,由 IntermediateCA 的证书和之后的 RootCA 的证书组成。
边注: 当我做
openssl x509 -text -noout -in IntermediateCA_chain.crt
仅显示 IntermediateCA 的证书。我预计链条会被展示。这是正确的行为吗?
我使用以下命令测试连接:
openssl s_client -connect server:995 -cert mycert.pem\
-key mykeyfile.pem -debug -CAfile IntermediateCA_chain.pem
导致
[...]
0b50 - b3 c3 3b 17 66 8e 52 b3-ad 7f 14 ..;.f.R....
depth=1 DC = top, DC = ad, CN = Intermediate CA
verify error:num=2:unable to get issuer certificate
issuer= C = DE, O = My Company, CN = My Companies Root CA, emailAddress = [email protected]
read from 0x10f6a10 [0x10fe333] (5 bytes => 5 (0x5))
[...]
我在两侧尝试了我能想到的 IntermediateCA_chain.pem 的每个变体(IntermediateCA.pem、RootCA.pem、IntermediateCA_chein.pem)。
似乎故障发生在客户端,因为它随着使用而略有变化-CAfile
,并且服务器的日志没有显示任何内容(实际上没有任何内容 - 没有连接尝试或其他任何内容)。在我看来,好像中间CA_chain.pem在服务器端或客户端上无法正确读取。该错误似乎导致 openssl 无法验证 IntermediateCA 及其颁发的证书。有人可以帮我解决这个谜语吗?
答案1
问题解决了。
我将发布原因和解决方案,以排除可能对其他人有所帮助的可能性:
第一个错误 ( ) 是由客户端使用的verify error:num=2:unable to get issuer certificate
格式引起的。-CAfile
它采用 x509 PEM 格式,包含 RootCA 证书的 IntermediateCA 证书链。问题是它还在其各自的证书块之后包含每个 CA 的 CRL(证书吊销列表)。删除它们解决了这个错误。
之后我只得到了一个非描述性的“SSL 错误”,我通过打开 nginx.conf 中的各个选项来诊断它(感谢 @mofoe 的提示!)。原来ssl_crl
里面nginx.conf不仅需要包含 IntermediateCA 的 CRL(采用 x509 PEM 格式!),还需要包含 Root-CA 的 CRL。将这两个文件合并到一个 CRL 文件中解决了第二个错误,并且服务器以预期的邮件服务器欢迎消息进行响应。