情况是这样的 - 有一个透明的 nginx 代理处理 SSL 证书,并且做得很好,直到我们决定添加出于安全原因需要的撤销列表管理。这时“ssl_crl”行开始发挥作用,把一切都搞砸了。
server {
listen 80;
rewrite ^ https://$host$request_uri permanent;
}
server {
listen 443 ssl;
server_name example.com;
ssl on;
ssl_certificate /home/netadmin/keys/tid.crt;
ssl_certificate_key /home/netadmin/keys/tid.key;
ssl_session_cache shared:SSL:10m;
ssl_client_certificate /home/netadmin/keys/personchain.pem;
ssl_crl /home/netadmin/keys/personlist.crl;
ssl_verify_client on;
ssl_verify_depth 2;
error_log /var/log/nginx/debug.log debug;
location / {
proxy_pass http://111.111.111.111:80;
}
每当用户尝试使用 SSL 进行身份验证时,服务器都会给出“400 Bad Request”错误。请注意,完全相同(语法不同)的配置在 Apache 中运行良好。现在证书是完美的,这已被多次证明,例如以下验证检查
openssl crl -CAfile personchain.pem -inform PEM -in personlist.crl -lastupdate -nextupdate -noout
verify OK
lastUpdate=Apr 22 14:59:18 2013 GMT
nextUpdate=Apr 29 14:59:18 2013 GMT
CRL 链接正常工作,并且没有任何错误,这是错误日志的一部分。
2013/04/23 15:47:42 [info] 3612#0: *1 client SSL certificate verify error: (3:unable to get certificate CRL) while reading client request headers, client: 192.168.122.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"
这基本上是唯一的错误,正如我之前所说,相同的证书也适用于 Apache。我以为这可能是一个错误,但最后一次通知类似的错误是在 2011 年,所以我怀疑还没有人解决这个难题。
答案1
与此处相同的答案:https://serverfault.com/a/676498/277052:如果您有多个 CA,则必须连接所有 CRL。
您必须连接链中的所有 CRL:根 CA 和中间 CA。
仅使用
openssl crl -in crl_list.crl -noout -text
读取第一个 crl,但 nginx 正确读取它们并验证用户证书。
答案2
nginx 进程是否对该 crl 具有读取权限?它是否采用正确的 pem 格式并由与 root crt 相同的 ca 签名?
例子:
$ openssl crl -text -noout -in personlist.crl