我很难用nginx代理SSL上游。我意识到代理HTTPS是浪费,但这是我的设置,有时候API是直接访问的,有时我使用nginx来提供JS应用程序,这也是API的客户端,CORS和浏览器安全要求JS应用程序通过以下方式与应用程序进行通信:
+--------------------+ +---------------------+
| |+-------------------->| |
| Pure HTTP API Host | | CLI Tool API Client |
| |<--------------------+| |
+--------------------+ +---------------------+
| ^ (:3152)
| |
| | | +---------------------+
| +--------------------------------| |
| | | Javascript App |
+---------------------------------->| |
| +---------------------+
|
nginx proxy for CORS
有了这个,这就是堆栈。 API主机是用GoLang编写的,使用来自StartSSL的签名证书提供:
$ openssl s_client -ssl3 -connect local.api.theproject.io:3251
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : SSLv3
Cipher : AES256-SHA
Session-ID:
Session-ID-ctx:
Master-Key: E021B27717F5A4
Key-Arg : None
Start Time: 1377589306
Timeout : 7200 (sec)
Verify return code: 21 (unable to verify the first certificate)
我已经截断了那个输出,但足以说Go的ListenAndServeTLS似乎只适用于SSLv3,因为以下失败:
$ openssl s_client -connect local.api.theproject.io:3251
CONNECTED(00000003)
35899:error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/ssl/s23_clnt.c:602:
因此nginx出现的问题很明显:
2013/08/27 09:30:21 [error] 35674#0: *3 kevent() reported that connect() failed (61:
Connection refused) while connecting to upstream, client: 127.0.0.1, server:
local.www.theproject.io, request: "GET / HTTP/1.1", upstream: "https://[::1]:3251//",
host: "local.www.theproject.io:4443"
2013/08/27 09:30:21 [error] 35674#0: *3 SSL_do_handshake() failed (SSL: error:1407742
E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version) while SSL handshaking
to upstream, client: 127.0.0.1, server: local.www.theproject.io, request: "GET /
HTTP/1.1", upstream: "https://127.0.0.1:3251//", host: "local.www.theproject.io:4443"
(注意:我在这里使用[::1]
,但这并不重要,当然也失败了127.0.0.1
)
因此问题是,缺少什么:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass https://local.api.theproject.io:3251/;
为了在内部使用SSLv3正确代理?
答案 0 :(得分:1)
你有没有试过“ssl_ciphers ALL;”?
虽然不推荐(因为它允许弱密码),但这应该缩小问题的范围。如果这不起作用,很可能导致问题的原因是您使用的openssl没有合适的密码来完成与Go服务器的SSL握手。
请注意,Go的tls包只是“部分”实现,supported ciphers非常有限。
有两种解决方案:
openssl ciphers
提供的内容(我认为)