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

Pav*_*tis 6 linux ssl nginx crl

情况是这样 - 有一个透明的 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;
    }
Run Code Online (Sandbox Code Playgroud)

每当用户尝试使用 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 
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

这基本上是唯一的错误,正如我之前所说,相同的证书适用于 Apache。我认为这可能是一个错误,但最近一次类似错误的通知是在 2011 年,所以我怀疑没有人解决过这个难题。

小智 2

与此处的答案相同: 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