问题描述
想通过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的问题,而是其他原因造成的?
nginx 支持多级证书验证, 只要设置相应的
ssl_verify_depth
.我觉得你应该在 nginx 上配置中间证书(intermediate), 而不是根证书. 并且, 该证书的 CN 和 nginx 域名必须保持一致.
可能的问题点
通过 wireshark 抓包可大致判断出是服务器还是客户端有问题, 依据 TCP RST(重置)包的发送方.
或者用排除法, 把 nginx 配置简化, 代理一个 HTTP 服务器, 然后用 curl 命令代替客户端做测试.
参考例子
由于篇幅太长, 移至文章 "nginx 代理服务器配置双向证书验证"
https://segmentfault.com/a/11...