nginx 配置SSL双向认证,客户端发送证书链验证失败

问题描述

想通过nginx代理EMQ服务器,SSL双向认证放到nginx上面做(SSL双向认证放到EMQ上面做握手也是失败,客户端发送client hello 之后,服务端直接返回告警了。(在client hello报文中的supported groups扩展中以0x0017开始就能握手成功,但是客户端的client hello报文无法修改。。。。))
使用nginx代理tcp连接,同时在nginx上开启SSL双向认证,服务端放的是根证书和私钥,并放置了客户端根证书(验证客户端证书链),客户端证书用的是三级证书(根证书--签发-->中间证书--签发-->客户端证书),SSL连接失败。客户端使用中间证书与nginx进行SSL连接是可以的。

问题出现的平台版本及自己尝试过哪些方法

nginx版本 1.15.8
nginx SSL部分配置:

stream{
    upstream backend{
        server 127.0.0.1:1883;
    }
    upstream backend1{
        server 127.0.0.1:1883;
        server 127.0.0.1:1893;
        server 127.0.0.1:1903;
    }
    
  server {
            listen 8884;
            #proxy_connect_timeout 150s;
            #proxy_buffer_size 3M;
            #tcp_nodelay on;
            #proxy_timeout 150s;
            proxy_pass backend1;
        }
  server {
            listen 8888 ssl;
            proxy_connect_timeout 50s;
            proxy_timeout 50s;
            proxy_pass backend;
            proxy_buffer_size 3M;
            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_certificate      D:/CERT/server-f/rootca.pem;
            ssl_certificate_key  D:/CERT/server-f/rootkey.pem;
            #ssl_session_timeout 10m;
            ssl_verify_depth 2;
            ssl_dhparam d:/dh-params.pem;
            ssl_client_certificate D:/CERT/client-f/rootca.pem;
            ssl_verify_client optional_no_ca;
       }

数据抓包如下:
图片描述
客户端上传了3份证书(客户端证书链)
图片描述

请问一下我该如何配置,才能是nginx验证通过我的三级证书链? 或者nginx根本不支持客户端发送上来的证书链包含3份以上的证书? 或者这更不不是nginx的问题,而是其他原因造成的?

阅读 6.8k
1 个回答

nginx 支持多级证书验证, 只要设置相应的 ssl_verify_depth .

我觉得你应该在 nginx 上配置中间证书(intermediate), 而不是根证书. 并且, 该证书的 CN 和 nginx 域名必须保持一致.

可能的问题点

  1. 证书有问题.
  2. nginx 配置有问题, 包括域名.
  3. 客户端证书验证有问题.

通过 wireshark 抓包可大致判断出是服务器还是客户端有问题, 依据 TCP RST(重置)包的发送方.
或者用排除法, 把 nginx 配置简化, 代理一个 HTTP 服务器, 然后用 curl 命令代替客户端做测试.

参考例子

由于篇幅太长, 移至文章 "nginx 代理服务器配置双向证书验证"
https://segmentfault.com/a/11...

推荐问题
宣传栏