当前位置: 首页 > 知识库问答 >
问题:

到Heroku的Nginx反向代理无法进行SSL握手

申屠昆
2023-03-14

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

简短的故事是,我在EC2(Ubuntu 14.04.4 LTS)上运行Nginx,以(a)托管我公司的营销网站(https://example.com,碰巧是Wordpress),(b)作为我们在Heroku(https://app.example.com)上运行的Rails应用程序的反向代理,用于某些路径。我们对example.com和app.example.com.都使用相同的SSL证书。所有这些在8-10个月内都非常有效,但我最近从Heroku的付费SSL插件切换到了新的免费SSL产品,现在我们的反向代理坏了。

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

SSL\u do\u handshake()在与上游进行SSL握手时失败(SSL:错误:14094438:SSL例程:SSL3\u READ\u字节:tlsv1警报内部错误:SSL警报编号80),客户端:ipaddress1,服务器:示例。com,请求:“GET/proxiedpath/proxiedpage HTTP/1.1”,上游:“https://ipaddress2:443/proxiedpath/proxiedpage”,主机:“example.com”

我试着四处寻找一些额外的指导——我升级了Nginx(1.10.1)和OpenSSL(1.0.2h),但运气不好。我怀疑这个问题可能是因为Heroku在新的免费SSL功能中使用了SNI(https://devcenter.heroku.com/articles/ssl-beta),但无法确定这可能是一个问题的原因。

关于我对这一点的探索,还有几点:

>

我无法通过nslookup或app返回的IP地址访问应用程序。实例com。herokudns。com。我怀疑这是正常的,也是意料之中的,但我不知道为什么会这样。和

从nslookup返回的IP地址与上面日志的错误消息(“ipaddress2”)中引用的IP地址不同。事实上,“ipaddress2”在整个日志中并不一致——它似乎定期更改。同样,我知道的还不够多,不知道我不知道什么... Heroku这边的负载平衡?

最后,我的Nginx反向代理在Nginx中配置如下。形态:

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/;
        }

    }

}

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

共有3个答案

许华清
2023-03-14

请尝试在上添加代理ssl服务器名称

location ^~ /proxiedpath/ {
    proxy_ssl_server_name on;
 }
燕翔飞
2023-03-14

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

因此,除了proxy_ssl_server_name之外,您可能还需要设置如下行:

proxy_set_header Host mycustomdomain.com;

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

您得到的具体错误是:

SSL证书错误

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

谷梁弘深
2023-03-14

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

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

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

这让我想到了proxy_ssl_server_name指令:

http://nginx.org/r/proxy_ssl_server_name

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

感谢所有提出建议的人!

 类似资料:
  • 我已经在预打包的jetty服务器前面安装了http反向代理。jetty服务器是预配置的应用程序,不太灵活。此Jetty服务器将只接受SSL请求。 我将nginx配置为使用自己的SSL证书在443上侦听SSL流量。然后在nginx后面,我在另一台运行jetty服务器的机器上有另一台服务器,在端口443上有自己的证书。 我的Nginx配置如下所示, 如果我在https上点击jetty服务器,就会得到一

  • 我试图使用nginx作为双向SSL/相互SSL的web逻辑的反向代理。 客户端<=双向SSL=>NGINX<=双向SSL=>WebLogic服务器 客户端到NGINX双向SSL工作良好,但在上游连接到web逻辑上出现以下错误。 nginx调试日志: 以下是我对上游的nginx配置: 我尝试了各种选项,包括注释下面的配置。 如果我尝试使用openssl c_client命令行,我能够连接并获得HTT

  • 主要内容:1. 代理服务器介绍,2. 将请求传递给代理的服务器,3. 传递请求标头,4. 配置缓冲区,5. 选择传出IP地址本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理服务器的基本配置目录 代理服务器介绍 将请求传递给代理的服务器 传递请求标头 配置缓冲区 选择传出IP地址 1. 代理服务器介绍 代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过

  • Nginx 是一个高性能的 HTTP 和反向代理服务器,代码完全用 C 实现,基于它的高性能以及诸多优点,我们可以把它设置为 hyperf 的前置服务器,实现负载均衡或 HTTPS 前置服务器等。 配置 Http 代理 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 IP 及 端口 server

  • 我目前正在尝试为客户端界面-服务器交互构建一个API。我已经决定使用ASP.NET核心作为API,Nginx作为托管平台(在Ubuntu 18.04上)。由于ASP.NET使用Kestrel,我们设置了一个反向代理,将请求从Nginx转发到Kestrel——也就是托管API的服务器。我们在NGINX服务器上设置了SSL,但是它没有在Kestrel服务器上设置。 简单地说,我不知道如何在 Kestr

  • 本小节,我们继续学习 Nginx 在 七层反向代理中的其它几种比较常见的情况,比如 web 服务中的 WebSocket 协议的反向代理和 uwsgi 协议的反向代理。 1. WebSocket的反向代理 WebSocket 是目前比较成熟的技术了, WebSocket 协议为创建客户端和服务器端需要实时双向通讯的 webapp 提供了一个选择。服务器可以向浏览器推送相关消息,这样在前端实现的某个