配置Nginx反向代理HTTP转HTTPS时无证书校验仍可用的原因问询
问题描述
现有两台部署Nginx的机器:
- Machine A(服务器):在4435端口启用HTTPS,使用自签名证书
- Machine B(客户端):配置Nginx反向代理,将
/site_manager路径的请求转发至Machine A的4435端口HTTPS服务,且Machine B未安装该自签名证书
测试结果:
- 通过Machine B的Nginx反向代理访问Machine A可正常工作(不符合预期)
- 直接用
curl访问Machine A的4435端口则失败(符合预期)
请问为何Nginx反向代理无需安装信任证书就能和Machine A建立HTTPS连接?
原因解析
核心原因是Nginx反向代理默认关闭了后端SSL证书的校验功能:
- 当Nginx作为反向代理发起HTTPS请求到后端服务器时,默认不会验证对方证书的合法性,哪怕是自签名证书,也能正常建立连接。
- 而
curl默认会严格校验服务器证书是否在系统信任列表中,自签名证书不在信任列表里,所以直接访问会失败,这是符合预期的安全行为。
如果要让Nginx反向代理也校验后端证书,需要在反向代理的location配置中添加以下指令:
proxy_ssl_verify on;:开启证书校验开关proxy_ssl_trusted_certificate /path/to/your-self-signed.crt;:指定信任的自签名证书路径proxy_ssl_verify_depth 2;:设置证书链的校验深度
示例配置如下:
location /site_manager { proxy_pass https://MachineA:4435; # 开启证书校验 proxy_ssl_verify on; # 指定信任的自签名证书文件 proxy_ssl_trusted_certificate /etc/nginx/certs/machineA-selfsigned.crt; # 设置证书校验深度 proxy_ssl_verify_depth 2; }
添加上述配置后,若Machine B未配置信任Machine A的自签名证书,Nginx反向代理就会像curl一样连接失败。
内容的提问来源于stack exchange,提问作者Mohamed Emad Emsawy
相关产品推荐
相关产品推荐

