我在尝试禁用一个域名的 HTTPS 时遇到了一个奇怪的问题,但另一个域名有 HTTPS。它们都是在专用服务器上运行的不同网站,共享相同的域名 IP 地址。但是,我有一个域名没有 SSL 证书,而另一个有。我想禁用未认证域名的 HTTPS,同时让另一个域名保持 HTTPS 开启。
我有两个不同的独立虚拟主机/etc/nginx/sites-enabled/
,
域名1.org(无 HTTPS)
server {
listen 80;
server_name www.domain1.org domain1.org;
root /var/www/domain1.org;
index index.html index.php index.htm;
error_log /var/www/logs/domain1.errors.log;
[ ... ]
域名2.com(使用 HTTPS)
server {
listen 443 ssl;
server_name domain2.com www.domain2.com;
# INCLUDE SSL CERTIFICATE
include sites-enabled/domain2_ssl_include;
root /home/domain2/www/www;
index index.html index.php index.htm;
[ ... ]
我已经为 domain1.org 添加了一个 443 端口监听器,但当我这样做时,Firefox 会提示中止错误(当访问https://domain1.org):
当前连接不可信任
您已要求 Firefox 安全连接到 domain1.org,但我们无法确认您的连接是否安全。
我打开了技术数据,看来 domain1.org 正在使用 domain2.com SSL 证书:
domain1.org 使用无效的安全证书。
该证书仅对以下名称有效:*.domain2.com、domain2.com
(错误代码:ssl_error_bad_cert_domain)
因此我将其添加到 domain1.org vhost 配置中:
server {
server_name domain1.org www.domain1.org;
listen 443 ssl;
rewrite ^ http://domain1.org permanent;
}
这仍然会提示我 Firefox 错误。
现在...当我访问http://domain1.org,我收到来自 nginx 的 400 错误,内容如下:
400 错误请求
普通 HTTP 请求已发送到 HTTPS 端口
我不太清楚该怎么做,禁用 httpsssl off;
没有任何效果。我如何才能真正禁用 domain1.org 的 HTTPS,而不禁用 domain2.com 的 HTTPS?
我正在使用运行 nginx 1.2.6 的 Ubuntu 12.04。
答案1
您将无法做您想做的事情。您要么:
- 如果您确实不想在该域上运行 SSL,则需要获取两个域的有效证书并使用 serverHost 指令重定向 SSL(至 http://)。
- 需要获取第二个 IP 地址并在单独的 IP 地址上运行域。
- 保持 SSL 启用并为 domain1 提供无效证书
为什么:
- 客户类型https://domain1.com/在浏览器中
- 浏览器将其解析为端口 443 上的 TCP 连接
- 互联网的魔力将这个连接路由到你的服务器,并希望进入你的网络服务器软件
- 客户端浏览器站在前门等待正确的“秘密握手”(SSL 证书)。
- 您的服务器尝试它所知道的唯一握手(这是错误的)
- 客户端的浏览器通知客户端“domain1.com 门口的这个人……他不是他所说的那个人。这很可疑”
- 今天,将点击浏览器显示的“仍然继续”选项
- 如果您在 domain1.com 上禁用 SSL,则用户将看到另一个网站(让用户感到困惑)
- 如果您在 domain1.com 上启用 SSL,现代浏览器和网络服务器将进行通信并显示正确的站点。(尽管,带着可怕的警告)
如果您打算在端口 80 上托管 domain1.org @ ip,在端口 443 上托管 domain2.org @ ip(这样 domain2 就没有 HTTP 访问权限,它应该可以“工作”)。删除 domain1 的 443 侦听器。如果有大胆的用户输入,系统将提示您https://domain1.org(然后显示域 2)。该设置本质上是基于端口的虚拟主机。您没有选择随机端口,而是选择了两个默认端口,并将它们分配给单独的虚拟主机。最终,在此设置中(使用 SSL),Web 服务器并不真正关心浏览器在 Host 标头中请求的域。Web 服务器只关心基于端口的虚拟主机中的 ip:port 组合。
答案2
这是 http 和 https 站点中相当常见的问题,而不仅仅是 Nginx 的问题。Apache、IIS 等也可能会遇到同样的问题。
如何正确解决这个问题
为您的 Web 服务器获取一个额外的 IP 地址,并将 domain2.org 设置为新 IP(IP #2)。另外,请注意您的 Web 服务器仅通过 IP #1 监听端口 80,并通过 IP #2 监听端口 80 和 443。
如果无法使用第二个 IP,则可采用以下解决方法
如果无法获得额外的 IP 地址,您只能实施变通方法。使用 domain2.org 的证书为 domain1.org 激活 SSL/TLS,并提供重定向到http://domain1.org/正如您已经做的那样。用户无论如何都会收到 SSL/TLS 警告,而且大多数人会忽略这些警告。但他们会被转发到正确的 URL。
nginx 的示例配置:
ssl_certificate /etc/ssl/certs/domain2.org.pem;
ssl_certificate_key /etc/ssl/private/domain2.org.key;
ssl_protocols SSLv3 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH;
ssl_session_cache shared:SSL:10m;
# domain1.org
server {
listen 80;
listen [::]:80;
server_name domain1.org;
# your configuration part ...
}
server {
listen 443 ssl spdy;
listen [::]:443 ssl spdy;
server_name domain1.org;
return 301 http://domain1.org/; # enforce correct protocol
}
# domain2.org
server {
listen 80;
listen [::]:80;
server_name domain2.org;
return 301 https://domain2.org/; # enforce correct protocol
}
server {
listen 443 default_server ssl spdy;
listen [::]:443 default_server ssl spdy;
server_name domain2.org;
# your configuration part ...
}
答案3
据我了解,您尝试执行的操作是无法实现的。SSL 要么在 IP 地址和端口上启用,要么未启用。您用于访问该 IP 地址的主机名对 SSL 本身没有影响,除非某些浏览器在协商过程中发送它。但如果您禁用 SSL,则不会进行协商,那么您将不知道他们试图访问哪个主机。所以这行不通。