为与HTTPS下的其他域共享IP的域禁用HTTPS

我遇到了一个奇怪的问题,试图禁用一个域的HTTPS,但另一个域有HTTPS。 它们都是在专用服务器上运行的不同网站,共享相同的域名IP地址。 但是,我有一个域没有SSL证书,但另一个。 我想为非authentication域禁用HTTPS,同时使其他域保留在HTTPS上。

我在/etc/nginx/sites-enabled/有两个不同的独立虚拟主机,

domain1.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; [ ... ] 

domain2.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虚拟主机configuration:

 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端口

我不完全确定该怎么做,closuresssl off; https ssl off; 没有效果。 我怎样才能真正禁用domain1.org的HTTPS,而不是domain2.com?

我使用运行nginx 1.2.6的Ubuntu 12.04。

你将无法做到你想要的。 您可以:

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

为什么:

  1. 客户端在浏览器中键入https://domain1.com/
  2. 浏览器将其parsing为端口443上的TCP连接
  3. 互联网的魔力将这个连接路由到您的服务器,并希望进入您的networking服务器软件
  4. 客户端浏览器站在前门等待正确的“秘密握手”(SSL证书)。
  5. 您的服务器尝试只知道它握手(哪个是错误的)
  6. 客户端的浏览器告诉客户:“这个在domain1.com门口的人……他不是他自己说的,这简直就是”
  7. 今天,将点击浏览器提供的“仍然继续”的变体
  8. 如果您在domain1.com上禁用了SSL,用户将会被显示在另一个站点( 对于用户来说相当混乱
  9. 如果您在domain1.com上启用SSL,则现代浏览器和networking服务器将进行通信并显示正确的站点。 ( 虽然有一个可怕的警告)

如果您打算在端口80上运行domain1.org @ ip,在端口443上运行在ip上的domain2.org(这样domain2不具有HTTP访问权限,它应该可以工作)。 删除domain1的443监听器。 如果任何大胆的用户inputhttps://domain1.org (然后显示domain2),系统会提示您。 该设置基本上是基于端口的虚拟主机。而不是select随机端口,你select了两个默认值,并给他们分开的虚拟主机。 最终,在这个设置中(使用SSL进行铺设),web服务器并不关心浏览器在Host头中要求的域名。 Web服务器只关心基于端口的虚拟主机中的ip:port组合。

如果我明白你想要做什么,那是不可能的。 SSL在IP地址和端口上启用,否则启用。 除了某些浏览器在协商过程中发送它,您使用哪个主机名来访问该IP地址对SSL本身没有影响。 但是,如果您禁用SSL,则不会进行协商,然后您就不知道要尝试访问哪个主机。 所以这是行不通的。

这是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,并提供redirect至http://domain1.org/的方法。 用户无论如何都会收到SSL / TLS警告,其中大部分都会忽略这些警告。 但是,所以他们得到转发到正确的url。

nginx的configuration示例:

 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 ... }