首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx反向代理到Heroku失败SSL握手

Nginx反向代理到Heroku失败SSL握手
EN

Stack Overflow用户
提问于 2016-07-14 13:28:33
回答 3查看 34K关注 0票数 37

不幸的是,我并不是一个很好的系统管理员,我遇到了一个让我的头撞到墙上的问题。

简而言之,我在EC2 (Ubuntu14.04.4LTS)上运行Nginx是为了(a)托管我公司的营销站点(顺便说一句是Wordpress),(b)作为我们在Heroku (https:// app.example.com)上运行的Rails应用程序的反向代理,用于某些路径。我们对example.com和app.example.com都使用相同的SSL证书。所有这些都很好用了8-10个月,但是最近我从Heroku的付费SSL插件转向了新的免费SSL服务,现在我们的反向代理已经崩溃了。

在检查Nginx错误日志时,我看到以下内容:

SSL_do_handshake()失败( SSL : routines:SSL3_READ_BYTES:tlsv1警报内部错误:SSL警报号80)而SSL握手到上游,客户端: ipaddress1,服务器: example.com,请求:"GET /proxiedpath/proxiedpage HTTP/1.1",上游:"https:// ipaddress2 2:443/proxiedpath/proxiedpage“,主机:"example.com”

我试图四处寻找一些额外的指导-我升级了Nginx (1.10.1)和OpenSSL (1.0.2h)没有运气。我怀疑这个问题可能是由于Heroku在新的免费SSL特性(https://devcenter.heroku.com/articles/ssl-beta)中使用了SNI,但还无法确定为什么会出现问题。

关于我对这一点的探索,我还要补充几点:

  • 当我切换到新的免费的Heroku时,我按照文档的指示,将app.example.com DNS记录更改为指向app.example.com.herokudns.com。应用程序通常可以通过app.example.com访问,当我在app.example.com和app.example.com.herokudns.com上运行nslookup时,我会得到相同的IP地址。然而..。
  • 我不能通过nslookup或app.example.com.herokudns.com返回的IP地址访问应用程序。我怀疑这是正常的和预期的,但不知道确切地说这是为什么。还有..。
  • 从nslookup返回的IP地址与上面日志的错误消息("ipaddress2")中引用的IP地址不一样。事实上,"ipaddress2“在日志中并不是一致的--它似乎是定期变化的。再说一次,我不知道我不知道什么.在Heroku那边的负载平衡?

最后,我的Nginx反向代理在nginx.conf中配置如下:

代码语言:javascript
复制
http {

    client_max_body_size 500M;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    server_names_hash_bucket_size 64;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    server {

        listen 443 default_server;
        server_name example.com;

        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        ssl on;
        ssl_certificate mycompanycert.crt;
        ssl_certificate_key mycompanykey.key;

        ssl_session_timeout 5m;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;

        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;

        location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ^~ /proxiedpath/ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto https;
            proxy_pass https://app.example.com/proxiedpath/;
        }

    }

}

任何帮助都是非常感谢的--非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-15 17:10:51

我今天能够解决这个问题,并希望发布解决方案,以防其他人遇到同样的问题。

事实证明,这个问题毕竟与SNI有关。我在nginx.org上找到了这张票:

https://trac.nginx.org/nginx/ticket/229

这让我看到了proxy_ssl_server_name指令:

name

通过在您的配置中设置为"on“,您将能够使用SNI代理到上游主机。

感谢所有提出建议的人!

票数 77
EN

Stack Overflow用户

发布于 2017-06-21 02:04:57

作为对其他人的注意,Heroku强加的一个相关条件是宿主字段必须与自定义域名匹配。

因此,除了proxy_ssl_server_name之外,您还可能希望设置如下一行:

代码语言:javascript
复制
proxy_set_header Host mycustomdomain.com;

当然,这仅适用于传入服务器的主机字段与服务器所在的域不同的情况。

您得到的具体错误是:

SSL证书错误 SSL连接、其证书和/或包含的HTTP请求之间存在冲突信息。

票数 12
EN

Stack Overflow用户

发布于 2021-07-22 05:25:31

请尝试添加proxy_ssl_server_name on

代码语言:javascript
复制
location ^~ /proxiedpath/ {
    proxy_ssl_server_name on;
 }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38375588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档