如何配置 nginx 通过端口和主机进行代理,并为每个端口和主机使用不同的 SSL 证书?

如何配置 nginx 通过端口和主机进行代理,并为每个端口和主机使用不同的 SSL 证书?

(已更新)我想代理这样的请求:

https://port123.host.com:85/any/path ==> http://server85:123/any/path
https://port567.host.com:85/any/path ==> http://server85:567/any/path
https://port123.host.com:86/any/path ==> http://server86:123/any/path
https://port567.host.com:86/any/path ==> http://server86:567/any/path

你建议我如何实现这个目标?(我知道这是一个有趣的架构)

服务器声明在没有 SSL 的情况下也可以工作,但是有了 SSL 则不行。

server {
    listen 86 ssl;
    server_name port123;
    ssl_certificate CERT123;
    ssl_...;
    localtion / { proxy_pass.... }
}

server {
    listen 86 ssl;
    server_name port567;
    ssl_certificate CERT567;
    ssl...;
    localtion / { proxy_pass.... }
}

我知道这是 nginx 的一个已知限制(单个端口和单个 IP 上的多个 SSLS)。但我想知道是否有任何简单的解决方法。我无法使用 SAN,因为我拥有的每台服务器实际上都是带有通配符证书的通配符。

答案1

您可以为希望 nginx 监听的每个端口创建一个服务器块。在服务器块中,您可以重定向到主机:端口组合。试试这个……它应该会按照您的要求执行:

server {
  listen       85;
  listen       [::]:85;
  server_name  port123.host.com;

  location / {
    proxy_pass         http://server85:123/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

server {
  listen       86;
  listen       [::]:86;
  server_name  port567.host.com

  location / {
    proxy_pass         http://server86:567/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

答案2

我最终为每个 SSL 端点设置了单独的 IP 地址。由于 TLS 会话在没有主机头的情况下进行,因此 nginx 无法“猜测”要使用哪个证书。因此 IP 修复了这个问题,而且我碰巧有一些可用的 IP。所以:

server {
    listen 192.168.1.5:85 ssl;
    server_name port123;
    ssl_certificate     /port123.crt;
    ssl_certificate_key /port123.key;
    location / {
        proxy_pass http://server85:123/;
    }
}

server {
    listen 192.168.1.6:86 ssl;
    server_name port123;
    ssl_certificate     /port567.crt;
    ssl_certificate_key /port567.key;
    location / {
        proxy_pass http://server86:567/;
    }
}

我实际上有更多组合,并且还设置了不同的标题。但它最终起作用了。

与往常一样,nginx 有最好的文章:http://nginx.org/en/docs/http/configuring_https_servers.html

相关内容