viv*_*agr 10 ssl nginx ssl-certificate
我用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
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这里有什么问题.
显然我需要一个站点 A 的专用 IP。
当使用 TLS 保护某些连接时,您通常使用证书来验证服务器(有时也验证客户端)。每个IP/端口有一台服务器,因此服务器选择要使用的证书通常没有问题。HTTPS 是例外——多个不同的域名可以引用一个 IP,并且客户端(通常是浏览器)针对不同的域名连接到同一台服务器。域名在请求中传递到服务器,该请求在 TLS 握手之后进行。这就是问题出现的地方 - Web 服务器不知道要提供哪个证书。为了解决这个问题,TLS 中添加了一个新的扩展,名为 SNI(服务器名称指示)。然而,并非所有客户都支持它。因此,一般来说,每个域的每个 IP/端口都有一个专用服务器是个好主意。换句话说,客户端可以使用 HTTPS 连接的每个域都应该有自己的 IP 地址(或不同的端口,但这并不常见)。
Nginx 正在侦听端口 443,当对站点 B 的请求通过 https 进行时,会发生 TLS 握手,并在提供内容之前提供站点 A 的证书。
| 归档时间: |
|
| 查看次数: |
4138 次 |
| 最近记录: |