vhosts和SSL之间的Nginx问题

我有两个站点在相同的IP与以下configuration:

  • site1.com
    • 多个子域(即:foo.site1.com,bar.site1.com)
    • 一切听着港口80,没有在443

  • site2WithSSL.com
    • 监听端口80和443(SSL)

我可以访问https://site2WithSSL.com和http://site1.com 没有问题。 当有人想访问https://site1.com时,问题出现了,nginx与site2WithSSL.com的答案我想避免这种情况。 我的意思是,只要有人访问https://site1.com,就不需要返回内容,或者只是redirect到https ://

configuration是:

server { listen 80; server_name *.site1.com; // ... } server { server_name www.site2WithSSL.com; return 301 $scheme://site2WithSSL.com$request_uri; } server { listen 80; listen 443 ssl; server_name site2WithSSL.com; ssl_certificate site2WithSSL.crt; ssl_certificate_key site2WithSSL.key; // ... } 

解决:每个网站使用不同的IP

你的问题是SSL不支持同一个IP上的多个虚拟主机。

当NGINX通过HTTP / 1.1接收到一个新的连接时,请求包括一个HOST头,它指定要服务哪个虚拟主机(这是1.1中的重大变化,并且允许我们今天所知的虚拟主机)。

但是,对于HTTPS,头文件被encryption,密钥交换和TLS层必须先被build立,然后才能被解密。 换句话说,nginx在发送SSL证书之前,无法select合适的SSL服务器块。

您可以在site2的configuration下添加一个匹配site1的域名的redirect,但是用户仍然会收到一条消息,说明证书是无效的,所以这不是很好吃。

有一些可以使用的多域名证书,虽然它会花费你。

最简单的,对于你想要的configuration,可能是最好的select,是为每个站点使用不同的IP地址。 不同的NGINX服务器configuration可以绑定到不同的地址,这样就不会有任何问题。 大多数提供商可以给你多个IP地址,有些甚至是多个块,当然在云中你可以提供更多的IP地址。

更新:SNI通过将主机头部移到encryption的有效负载之外来解决这个问题,并受到现代浏览器的支持。

因为只知道客户端希望从SSL客户端Hello获得哪个站点,所以不能在同一个IP上的端口443上监听端口443。 收到Hello后,可以select完成SSL握手或切断连接。 在第一种情况下,你需要提供一个证书,在后一种情况下,客户端将得到一些关于断开SSL连接的无用的错误。

最后归结为以下几个选项:

  • 切断连接,并在客户端导致一些奇怪的错误消息(我不知道你是否可以用nginx来启用这个行为)。
  • 提供与site2WithSSL.com相同的证书,并将客户端redirect到http-only。 不幸的是,redirect将在SSL握手之后完成,并且由于主机名与证书不匹配,此SSL握手将在客户端上导致错误。
  • 对site1使用自签名证书并redirect到仅限http:同样的问题,因为客户端不会接受证书。
  • 即使您仅使用它redirect到http-only,也可以为site1使用真实的证书。

只有最后一个选项在客户端没有任何错误。

我正在考虑site1.com没有ssl的端口443监听configuration,只有redirect到http://site1.com 。 我认为它应该工作,而不需要一个新的IP地址。