12

我正在使用 Nginx 为两个站点提供服务。第一个站点(比如 A)有 SSL 证书,而第二个站点(比如 B)没有。在 https 上打开站点 A 和在 http 上打开 B 时,站点 A 工作正常。但是当我在 https 上访问站点 B 时,nginx 会使用域 B 提供站点 A 的 SSL 证书和内容,这不应该发生。

站点 A 的 Nginx 配置如下。对于站点 B,它只是 Flask 应用程序的反向代理。

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

server {
        listen 443 ssl;
        server_name siteA.com;

        ssl_certificate /path/to/cert.cert
        ssl_certificate_key /path/to/cert_key.key;

        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:CAMELLIA128-SHA;

        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
        keepalive_timeout   70;

        # and then the `location /` serving static files
}

我无法弄清楚这里出了什么问题。

4

4 回答 4

2

显然我需要站点 A 的专用 IP。

引用“每个 SSL 证书都需要一个专用 IP”到底是什么意思?

当使用 TLS 保护某些连接时,您通常使用证书来验证服务器(有时是客户端)。每个 IP/端口有一台服务器,因此通常服务器选择要使用的证书是没有问题的。HTTPS 是一个例外——几个不同的域名可以引用一个 IP,并且客户端(通常是浏览器)连接到同一个服务器以获得不同的域名。域名在请求中传递给服务器,该请求在 TLS 握手之后进行。这就是问题所在 - Web 服务器不知道要出示哪个证书。为了解决这个问题,TLS 中添加了一个新的扩展,名为 SNI(服务器名称指示)。但是,并非所有客户端都支持它。所以一般来说,每个域的每个 IP/端口都有一个专用服务器是个好主意。换句话说,每个域,

Nginx 正在侦听端口 443,当对站点 B 的请求通过 https 进行时,发生了 TLS 握手,并且在提供内容之前提供了站点 A 的证书。

于 2013-09-26T08:46:35.780 回答
1

ssl_certificate 参数应该用;结束。获得预期的输出。

还要确保您使用以下命令在所有配置文件参数中遵循正确的语法,然后重新启动或重新加载服务:

sudo nginx -t
于 2019-10-17T08:51:37.233 回答
0

NGINX 支持 SNI,因此可以使用来自同一 IP 地址的不同证书为不同的域提供服务。这可以通过多个服务器块来完成。NGINX 已在 http://nginx.org/en/docs/http/configuring_https_servers.html中记录了这一点

对我来说 HTTP2 和 IPv6 很重要,所以我要听 [::] 并设置 ipv6only=off。显然这个选项应该只为第一个服务器块设置,否则 NGINX 将无法启动。

duplicate listen options for [::]:443

这些服务器块

server {
    listen [::]:443 ssl http2 ipv6only=off;
    server_name siteA.com www.siteA.com;

    ssl_certificate /path/to/certA.cert
    ssl_certificate_key /path/to/certA_key.key;
}
server {
    listen [::]:443 ssl http2;
    server_name siteB.com www.siteB.com;

    ssl_certificate /path/to/certB.cert
    ssl_certificate_key /path/to/certB_key.key;
}
于 2017-11-01T09:47:29.090 回答
-1

如果您在服务器和一个 Nginx 配置中托管多个站点(如果您有)listen 443 ssl http2 default_server;

default_server将为所有域提供相同的证书。删除它将解决问题。

在学习本教程时,我完全错过了这一部分:

注意:对于每个 IP 版本和端口组合,您可能只有一个包含 default_server 修饰符的监听指令。如果您为这些设置了 default_server 的端口启用了其他服务器块,则必须从其中一个块中删除修饰符。

于 2016-08-21T16:41:51.413 回答