Nginx - 上游 SSL - 在 SSL 握手中对等方关闭了连接

25

我遇到了这个错误:

前端错误:502 Bad gateway

99.110.244:443

2017/09/28 13:03:51 [error] 34080#34080: *1062 peer closed connection in SSL handshake (104: Connection reset by peer) while SSL handshaking to upstream, client: 10.210.0.81, server: webshop.domain.be, request: "GET / HTTP/1.1", upstream: "https://10.1.10.61:443/", host: "webshop.domain.be"

配置:

        # Zone voor connection logging
        limit_conn_zone $binary_remote_addr zone=izSSL_webshop-api_CZ:10m;

        # Zone voor rate logging
        # Hoge rate limit.  x r/s is soms wat snel
        # 10 MB (10m) will give us enough space to store a history of 160k requests.
        limit_req_zone $binary_remote_addr zone=izSSL_webshop-api_RZ:10m rate=20r/s;


upstream webshop_domain_be {
        server webshop.domain.be:443;
}


server {
        listen       443 ssl;
        server_name  webshop.domain.be webshop;

        client_max_body_size 80M;

        ssl_session_cache    shared:webshopSSL:1m;
        ssl_session_timeout  10m;
        ssl_certificate /var/www/certs/webshop.domain.be/webshop.domain.be-chain.pem;
        ssl_certificate_key /var/www/certs/webshop.domain.be/webshop.domain.be-key.pem;
        ssl_verify_client off;
        ssl_protocols        SSLv3 TLSv1 TLSv1.1 TLSv1.2;

        ssl_ciphers RC4:HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;


        location / {

                proxy_ssl_session_reuse off;
                proxy_pass $scheme://webshop_domain_be;

        }
}

nginx版本:nginx/1.10.3 (Ubuntu)

另一个服务器(10.1.10.61)是一个IIS服务器,使用与我在此代理中使用的相同的证书(对吗?)。这不是IIS的问题;代理服务器可以访问10.1.10.61 / 端口443。

基于https://serverfault.com/questions/583374/configure-nginx-as-reverse-proxy-with-upstream-ssl的配置。

我正在使用Let's Encrypt证书。


7
请尝试在您的proxy_pass块中添加“proxy_ssl_server_name on;”,看看是否有帮助。 - Tarun Lalwani
1
尝试将 webshop.domain.be:443 更改为实际 IP。并使用 proxy_ssl_name "webshop.domain.be"。如果这样不起作用,请尝试添加 proxy_ssl_server_name on; - Tarun Lalwani
你是我的英雄Tarun!非常感谢你! - Jeffrey
发布哪些有效的内容以及是否需要使用 proxy_ssl_server_name,这样我就可以记录答案了。 - Tarun Lalwani
@TarunLalwani:刚遇到了同样的问题,“proxy_ssl_server_name”选项对我来说是解决方案。谢谢! - charlie
显示剩余6条评论
7个回答

37

proxy_pass 后添加以下行可解决问题:

proxy_ssl_server_name on;

在此之前,您可以参考此处

对于 REDHAT 7 / CentOS 7 / Oracle Linux 7:

  1. https://letsencrypt.org/certificates/下载活动PEM证书,并将其放置于/etc/pki/ca-trust/source/anchors中。
  2. 执行:sudo update-ca-trust

不确定是否需要最后两个步骤,但两者都为我解决了问题。

谢谢!


13
我曾经遇到过这个问题,我不得不在我的位置块中添加以下内容:
``` proxy_ssl_name your.proxiedserver.name; proxy_ssl_server_name on; ```

7

以下是对我有效的解决方案。我有一个包含通配符搜索的 server_name 设置的服务器部分,并且必须在 location 部分执行以下操作:

proxy_ssl_name $host;
proxy_ssl_server_name on;
proxy_pass https://istio-ingress-gateway

当我在另一个K8集群中使用外部负载均衡器将来自我的DMZ的请求转发到使用Istio的我的服务所在的辅助集群时,这个东西拯救了我。 - Jeff Beagley

2
将您的上游更改为使用IP
upstream webshop_domain_be {
        server <IP>:443;
}

然后更改您的proxy_pass块为:

location / {
   proxy_ssl_session_reuse off;
   proxy_ssl_server_name "webshop.domain.be";
   proxy_pass $scheme://webshop_domain_be;
}

如果上述方法不起作用,那么请在配置文件中添加proxy_ssl_server_name on;

3
目前为止,你无法将proxy_ssl_server_name设置为除on或off以外的任何内容。 - Jmons

0

简单

server {
        listen 443 ssl;
        server_name webshop1.domain.be;

        ....................

        location / {
            proxy_set_header Host webshop2.domain.ce;
            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 $scheme;
            proxy_pass https://webshop2.domain.ce/api/web/qrcode/;
        }
}

0

我使用 @nginx

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_buffer_size 4k;

使用

grep worker_processes /etc/nginx/nginx.conf
worker_processes auto; <<<-- auto not the default value "1"

0
为了改进其他答案,我想说: upstream非常重要。
对于简单的从一个域名重定向到另一个域名,只需使用以下代码:
http {
....
upstream someserver {
        server your.domain.name.com:443;
}

location / {
   proxy_pass https://someserver;
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接