我正在使用Nginx服务两个网站。第一个站点(比如A)有SSL证书,第二个站点(比如说B)没有。在https上打开站点A并在http上打开B时工作正常。但是当我在https上访问站点B时,nginx提供SSL证书和站点A的内容与B域,这不应该发生。
站点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
}
我无法弄清楚这里有什么问题。
答案 0 :(得分:2)
显然我需要为网站A提供专用IP。
引自What exactly does "every SSL certificate requires a dedicated IP" mean?
在使用TLS保护某些连接时,通常使用证书对服务器(有时是客户端)进行身份验证。每个IP /端口有一个服务器,因此通常服务器选择使用哪个证书没有问题。 HTTPS是例外 - 几个不同的域名可以引用一个IP,而客户端(通常是浏览器)连接到不同域名的同一服务器。域名在请求中传递给服务器,在TLS握手之后。这就是出现问题的地方 - Web服务器不知道要出示哪个证书。为了解决这个问题,在TLS中添加了一个新的扩展名,名为SNI(服务器名称指示)。但是,并非所有客户都支持它。因此,一般来说,每个域的每个IP /端口都有一个专用服务器是个好主意。换句话说,客户端可以使用HTTPS连接的每个域应该有自己的IP地址(或不同的端口,但这不常见)。
Nginx正在侦听端口443,当站点B的请求继续进行https时,发生了TLS握手,并在提供内容之前显示了站点A的证书。
答案 1 :(得分:1)
应该使用; 关闭ssl_certificate参数,以获取预期的输出。
还要确保使用以下命令在所有配置文件参数中遵循正确的语法,然后重新启动或重新加载服务:
sudo nginx -t
答案 2 :(得分: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;
}
答案 3 :(得分:-1)
如果您在服务器和一个Nginx配置中托管多个站点,如果您有listen 443 ssl http2 default_server;
default_server
将为所有域提供相同的证书。删除它将解决问题。
在关注tutorial之后,我完全错过了这一部分:
注意:您可能只有一个listen指令,其中包含每个IP版本和端口组合的default_server修饰符。如果为这些设置了default_server的端口启用了其他服务器块,则必须从其中一个块中删除修改器。