禁用与使用 HTTPS 的另一个域共享 IP 的域的 HTTPS

禁用与使用 HTTPS 的另一个域共享 IP 的域的 HTTPS

我在尝试禁用一个域名的 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

您将无法做您想做的事情。您要么:

  1. 如果您确实不想在该域上运行 SSL,则需要获取两个域的有效证书并使用 serverHost 指令重定向 SSL(至 http://)。
  2. 需要获取第二个 IP 地址并在单独的 IP 地址上运行域。
  3. 保持 SSL 启用并为 domain1 提供无效证书

为什么:

  1. 客户类型https://domain1.com/在浏览器中
  2. 浏览器将其解析为端口 443 上的 TCP 连接
  3. 互联网的魔力将这个连接路由到你的服务器,并希望进入你的网络服务器软件
  4. 客户端浏览器站在前门等待正确的“秘密握手”(SSL 证书)。
  5. 您的服务器尝试它所知道的唯一握手(这是错误的)
  6. 客户端的浏览器通知客户端“domain1.com 门口的这个人……他不是他所说的那个人。这很可疑”
  7. 今天,将点击浏览器显示的“仍然继续”选项
  8. 如果您在 domain1.com 上禁用 SSL,则用户将看到另一个网站(让用户感到困惑
  9. 如果您在 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,则不会进行协商,那么您将不知道他们试图访问哪个主机。所以这行不通。

相关内容