带有两种 SSL 到 weblogic 的 nginx 反向代理
Posted
技术标签:
【中文标题】带有两种 SSL 到 weblogic 的 nginx 反向代理【英文标题】:nginx reverse proxy with two way SSL to weblogic 【发布时间】:2014-10-10 12:15:18 【问题描述】:我正在尝试使用 nginx 作为具有两种 SSL/相互 SSL 的 Web 逻辑的反向代理。
客户端 NGINX WebLogic 服务器
客户端到 NGINX 两种方式 SSL 工作正常,但在上游连接到 Web 逻辑时出现以下错误。
nginx 调试日志:
2014/08/16 22:40:53 [调试] 33741#0: *9 SSL 握手处理程序: 0 2014/08/16 22:40:53 [调试] 33741#0: *9 SSL_do_handshake: -1 2014/08/16 22:40:53 [调试] 33741#0: *9 SSL_get_error: 2 2014/08/16 22:40:53 [调试] 33741#0:计时器增量:5 2014/08/16 22:40:53 [调试] 33741#0:发布事件 0000000000000000 2014/08/16 22:40:53 [调试] 33741#0:工作周期 2014/08/16 22:40:53 [调试] 33741#0:kevent 计时器:59840,更改:0 2014/08/16 22:40:53 [调试] 33741#0:kevent 事件:2 2014/08/16 22:40:53 [调试] 33741#0: kevent: 7: ft:-2 fl:0025 ff:00000000 d:131520 ud:00007FF263805150 2014/08/16 22:40:53 [调试] 33741#0: *9 kevent: 7: ft:-2 fl:0025 ff:00000000 d:131520 ud:00007FF263805150 2014/08/16 22:40:53 [调试] 33741#0: *9 SSL 握手处理程序: 1 2014/08/16 22:40:53 [调试] 33741#0: *9 SSL_do_handshake: 0 2014/08/16 22:40:53 [调试] 33741#0: *9 SSL_get_error: 1 SSL_do_handshake() 在 SSL 与上游握手时失败(SSL:错误:14094410:SSL 例程:SSL3_READ_BYTES:sslv3 警报握手失败:SSL 警报号 40) 客户端:本地主机,服务器:本地主机,请求:“GET /customers/~/xxxx/~/xxx/health HTTP/1.1”,上游:“https://xx.xx.xx.xxx:11211/customer-upstream/ ~/xxx/~/xxx/health/”,主机:“本地主机:12121”这是我的上游 nginx 配置:
proxy_cache_path /opt/openresty/nginx/cache levels=1:2 keys_zone=data-cache:8m max_size=1000m inactive=600m; proxy_temp_path /opt/openresty/nginx/cache/tmp; 上游 rs_backend 服务器 xx.xx.xx.xxx:11211; 服务器 server_name 本地主机; 听 12121 ssl; 开启ssl; ssl_verify_client 开启; ssl_session_cache 共享:SSL:1m; ssl_session_timeout 10m; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; #ssl_protocols TLSv1; #ssl_ciphers SSL_RSA_WITH_RC4_128_MD5:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!茶花; #ssl_ciphers HIGH:!MD5:!aNULL:!EDH:!CAMELLIA; ssl_prefer_server_ciphers 开启; proxy_ssl_session_reuse 关闭; large_client_header_buffers 4 32K; ssl_certificate /etc/ssl/api-cert.pem; ssl_certificate_key /etc/ssl/api-cert.key; ssl_client_certificate /etc/ssl/api-cert.pem; 位置/客户/ 重写 ^/customers/(.*) /customer-upstream/$1/ break; 代理重定向关闭; proxy_ssl_verify 开启; proxy_ssl_verify_depth 4; proxy_ssl_trusted_certificate /etc/ssl/api-cert-nopass.pem; proxy_pass_header 服务器; proxy_http_version 1.1; proxy_set_header 连接保持活动; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header 主机 localhost:11211; proxy_set_header 接受 'application/json;v=3'; proxy_pass https://xx.xx.xx.xxx:11211/; #proxy_pass https://rs_backend;我尝试了各种选项,包括在配置下方注释掉。
proxy_ssl_verify 开启; proxy_ssl_verify_depth 4;如果我尝试使用 openssl c_client 命令行,我可以连接并获得 HTTP GET 请求的 2xx 响应。
openssl c_client -connect xx.xx.xx.xxx:11211 -cert api-qaid-nopass.pem任何帮助将不胜感激。
【问题讨论】:
为什么要投反对票?看到问题已通过应用代码补丁解决。 【参考方案1】:proxy_ssl_trusted_certificate 用于验证上游服务器的证书,而不是指定连接上游服务器时应使用的客户端证书。据我所知,目前有一种方法可以让 ngnix 在上游连接中使用客户端证书。
【讨论】:
我正在使用从 jks 文件中提取的服务器证书,如下所示,它不起作用。 /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home/bin/keytool -export -alias api-cert -storepass xxx -file server.cer -keystore api-cert.jks 我还尝试了以下命令来提取证书: keytool -export -file /tmp/trustedcafile.der -keystore api-cert.jks -alias api-cert ; openssl x509 -inform DER -outform PEM -text -in /tmp/trustedcafile.der -out /tmp/api-cert.pemopenssl s_client
指定一个客户端证书以用于上游,而 nginx 则不需要。因此,相互认证使用 s_client 成功,使用 nginx 失败。【参考方案2】:
我添加了对使用证书和密钥的两种方式/相互身份验证的支持。
查看拉取请求:
https://github.com/nginx/nginx/pull/7
http://mailman.nginx.org/pipermail/nginx-devel/2014-August/005817.html
已针对配置为双向 SSL 的 WebLogic 11g 服务器进行了验证。
【讨论】:
以上是关于带有两种 SSL 到 weblogic 的 nginx 反向代理的主要内容,如果未能解决你的问题,请参考以下文章