node.js - 是否可以让上游服务器在 Nginx 服务器后面处理 SSL 证书?

标签 node.js ssl nginx https

我有一个 Nginx 服务器处理 http 请求并做代理传递到上游的一些 Node 服务器,如果域名匹配启用的站点之一,所有数据包都被重定向到一个 Node 服务器,只有 channel 是 SSL,否则 301到 https 版本:

server {
    listen         80;
    server_name    something.com
    return 301     https://$host$request_uri;
}

server {
    listen 433;
    server_name something.com;

    ssl_certificate           /etc/nginx/cert.crt;
    ssl_certificate_key       /etc/nginx/cert.key;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://127.0.0.1:3000/;
      proxy_redirect off;
    }
 }

一切正常,但证书管理、SSL 握手等是由 Nginx 完成的。我希望每个 Node 服务器都在上游管理它们自己的 SSL 首选项,因此我不依赖 Nginx 来执行此操作。我的 Node 服务器已经支持 https 请求,但我不明白是否可以告诉 Nginx:

  • 听 80,如果出现问题,则对它的 https 版本执行 301。
  • 听 433,不用担心 SSL,只需代理将所有内容传递给 localhost:3000

  • 并且监听3000端口的 Node 服务器处理SSL

最佳答案

Listen to 433, don't worry for SSL, just proxy pass everything to localhost:3000

不,不是 nginx,你必须为此使用端口转发。

nginx 要么必须使用一些 SSL key 并可能使用 SSL 将流量代理到某些 Node 应用程序,这将意味着 Node 和 nginx 都必须管理他们自己的 SSL key (nginx 用于客户端-nginx 连接和 Node用于 nginx-nodeApp 连接的应用程序)。

或者 nginx 可以使用不带 SSL 的 HTTP 将请求代理到使用 SSL 的 Node ,这将意味着客户端-nginx 连接不安全,只有 nginx-NodeApp 连接是安全的。这也意味着 https://www.example.com/不会工作 - 尽管 http://www.example.com:443/会的。

如果您希望 Node 处理 SSL key 而不是反向代理(通常这样做),那么您必须在 TCP/IP 级别使用端口转发将流量传递到 Node 应用程序,而无需使用完全没有反向代理 (nginx)。

通常使用反向代理,这样应用程序就不必处理用于客户端连接(以及其他事项)的 SSL key 。如果您希望 Node 应用程序使用 SSL key 而不是反向代理,那么您应该首先重新考虑使用反向代理。

关于node.js - 是否可以让上游服务器在 Nginx 服务器后面处理 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44948527/

相关文章:

javascript - 试图捕获与代码无关的错误,而是像互联网不工作那样的错误,我将如何去做呢?

node.js - 无法使用 npx create-react-app 安装 React 应用程序。 Node 引擎 "node"与该模块不兼容

json - 表达多个 res.json();使用中间件

iis - WCF 无法与 iis 中的权限建立 SSL/TLS 安全通道的信任关系

ssl - 尽管有 --insecure 和 w/o 代理 : ssl3_get_record:wrong version number,但 curl 错误

python - 在代码级别或 Nginx 级别保护 OTP API 的安全?

javascript - 跨子域请求

javascript - 从 Google Map API 获取 'Most Helpful' 而不是 'Latest' 评论

python - AWS EC2 免费层 Django 应用程序

ssl - Github 无法访问 SSL 连接错误