OpenResty反向代理HTTPS请求转发报400错误:原因排查
问题分析与解决方案
错误原因
- 排除自签名证书问题:从curl日志可以明确看到
SSL certificate verify ok,说明代理的证书验证已通过,证书不是报错原因。 - 核心问题:你的OpenResty配置是反向代理模式,但测试时使用了HTTP正向代理的调用方式(curl的
-x参数指定HTTP代理),发送了CONNECT请求,而Nginx默认没有处理CONNECT请求的逻辑,因此返回400错误。
解决方案
根据你"按原协议转发所有请求至原URL"的需求,分两种场景调整:
场景1:需要作为HTTP正向代理(支持HTTPS请求的CONNECT隧道)
修改/usr/local/openresty/nginx/conf/sites-available/proxy.conf,添加处理CONNECT请求的配置:
server { error_log /usr/local/openresty/nginx/logs/error.log debug; listen 1080 ssl; server_name localhost; ssl_certificate /usr/local/openresty/nginx/ssl/localhost.crt; ssl_certificate_key /usr/local/openresty/nginx/ssl/localhost.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers off; # 处理CONNECT请求,实现HTTPS正向代理隧道 proxy_connect; proxy_connect_allow 443 8443; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; location / { access_by_lua_block { -- 你的业务逻辑 } resolver 8.8.8.8; proxy_pass $scheme://$host$request_uri; } }
说明:
proxy_connect是OpenResty内置模块,默认已编译,用于处理HTTP代理的CONNECT请求。
场景2:仅需作为反向代理(无需支持HTTP正向代理)
调整测试命令,去掉-x参数,直接访问代理服务器,由反向代理转发请求:
curl -v -I https://localhost:1080/questions/38371840/ssl-pass-through-in-nginx-reverse-proxy
说明:此时
$host会默认取localhost,若需固定转发到指定域名,可修改配置中的$host为目标域名,或通过请求头传递目标地址。
内容的提问来源于stack exchange,提问作者Luixv
相关产品推荐
相关产品推荐

