nginx 上的 SSL 代理——不同客户端上的行为不同

nginx 上的 SSL 代理——不同客户端上的行为不同

我正在运行需要 SSL 的 Web 服务,并计划更换托管服务提供商。为了避免在清除 DNS 缓存时导致用户停机,我计划将旧服务器的请求代理到新服务器几天。新旧网站都运行 nginx 和 openssl。

我有一个设置在 Chrome 和 Firefox 中运行良好,但在 Safari 和 curl 中却失败了。

我的旧服务器的 nginx(1.6.2)配置中的代理配置部分非常简单:

upstream droplet {
    server zin.droplets.gimlet.us:443;
}

server {
    listen   80;
        listen   443 ssl;
        server_name demo.gimlet.us;
#   proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#   proxy_ssl_session_reuse off;
    proxy_set_header Host       $host;
    location / {
        proxy_pass https://droplet;
    }
    error_log /tmp/proxy_error.log;
    access_log /tmp/proxy_access.log;
}

(改变proxy_ssl_protocolsproxy_ssl_session_reuse似乎没有什么区别)

有趣的是,Safari 和 curl 的请求不会在我的 /tmp 日志中生成日志条目。然而,在主 error.log 中,我得到了如下条目:

2014/11/21 17:02:08 [alert] 2937#0: worker process 13634 exited on signal 11

curl -v 的输出表明 SSL 握手正常,但随后出现了问题:

$ curl -v https://demo.gimlet.us/favicon.ico
* About to connect() to demo.gimlet.us port 443 (#0)
*   Trying 74.50.48.201...
* connected
* Connected to demo.gimlet.us (74.50.48.201) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: description=e08NImA1P8R1ukwA; C=US; ST=Wisconsin; L=Madison; O=Nathanael Vack; CN=*.gimlet.us; [email protected]
*    start date: 2014-04-10 16:59:37 GMT
*    expire date: 2016-04-11 09:29:37 GMT
*    subjectAltName: demo.gimlet.us matched
*    issuer: C=IL; O=StartCom Ltd.; OU=Secure Digital Certificate Signing; CN=StartCom Class 2 Primary Intermediate Server CA
*    SSL certificate verify ok.
> GET /favicon.ico HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8z zlib/1.2.5
> Host: demo.gimlet.us
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host demo.gimlet.us left intact
curl: (52) Empty reply from server
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

值得注意的是,

$ curl http://demo.gimlet.us/favicon.ico

工作正常。

我感觉我遗漏了一些非常基本的东西。有什么建议可以让我在哪里找到更多想法吗?

答案1

注意到 SSL 似乎可以与同一服务器上的其他域一起使用,我添加了更多 SSL 配置指令。这个:

ssl_session_cache shared:SSL:10m;

修复了段错误。

我相信这张票是根本问题;nginx 认为 OpenSSL 是问题所在。

有效的 nginx 级别修复(以及我现在正在做的事情,因为我知道发生了什么)是在上下文中执行 nginx 范围的 SSL 配置,http而不是在一堆server上下文中重复它。

相关内容