我正在使用 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仓库。我可以使用apt-get update对该仓库进行更新,而不会出现任何错误,但是当我注释掉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为什么可以找到我的证书吊销列表。

最佳答案

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

当我创建根CA和中间CA以便为Intranet站点生成证书时,我自己碰到了这一点。当我将,nginx 配置为使用SSL客户端身份验证时,我仅使用了来自中间CA的CRL。 nginx 需要查看链中每个证书(包括中间CA)的CRL,以确保根目录未撤消中间CA的证书。将根CRL连接到中间CRL可以解决此问题。

笔记

  • 默认的CRL有效期(default_crl_days)是30天,因此您需要制定一个系统来使所有内容保持最新。
  • 非常感谢this post,它是我在经过Google-fu之后发现的,它表明我缺少该链中的另一个证书。
  • 关于Nginx无法获得证书CRL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17086934/

    10-11 17:41