我遇到了一个奇怪的问题,试图禁用一个域的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。
你将无法做到你想要的。 您可以:
为什么:
如果您打算在端口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地址是不可能的,你只能实施一个解决方法。 使用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 ... }