9

我正在使用nginx(1.1.9)通过使用客户端证书功能在 https 上提供 debian 包。

listen 443 ssl;

 ...

 ssl_certificate     /etc/ssl/ca.chain.crt;
 ssl_certificate_key /etc/ssl/server.key;
 #ssl_crl             /etc/ssl/ca-crl.pem;
 ssl_client_certificate  /etc/ssl/ca.pem;
 ssl_verify_client   on; 
 ssl_verify_depth 2;   
 ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1;

 ...

 error_log /var/log/nginx/error.log debug;
 ...

我使用 reprepro 配置一个 apt repo。我可以使用 apt-get update 对此 repo 没有任何错误,但是当我注释掉 ssl_crl 以使用吊销列表时,日志显示:

client SSL certificate verify error: (3:unable to get certificate CRL) while reading client request headers, client: xxx.xxx.xxx.xxx, server: apt.myrepo.com, request: "GET /ubuntu/dists/precise/non-free/i18n/Translation-en HTTP/1.1", host: "apt.myrepo.com"

我不确定为什么 nginx 可以找到我的证书吊销列表。

4

1 回答 1

6

发生这种情况是因为nginx需要为证书链中提到的每个证书提供 CRL ssl_client_certificate,包括根 CA 的 CRL。

当我创建根 CA 和中间 CA 以便为 Intranet 站点生成证书时,我自己打了这个。当我将nginx配置为使用 SSL 客户端身份验证时,我只使用了来自中间 CA 的 CRL。 nginx需要查看链中每个证书的 CRL,包括中间 CA,以确保中间 CA 的证书没有被根撤销。将根 CRL 连接到中间 CRL 解决了这个问题。


笔记

  • 默认的 CRL 有效期 ( default_crl_days) 为 30 天,因此您需要制定一个系统以使所有内容保持最新。
  • 感谢这篇文章,我在经过大量 Google-fu 后发现,这表明我在链中缺少另一个证书。
于 2017-05-10T22:31:36.623 回答