nginx 代理 + ssl +clr“400 错误请求”错误

nginx 代理 + ssl +clr“400 错误请求”错误

情况是这样的 - 有一个透明的 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 正确读取它们并验证用户证书。

灵感来自:https://www.ruby-forum.com/topic/6874370

答案2

nginx 进程是否对该 crl 具有读取权限?它是否采用正确的 pem 格式并由与 root crt 相同的 ca 签名?

例子:

$ openssl crl -text -noout -in personlist.crl

参考:http://www.apacheweek.com/features/crl

相关内容