Nginx同一个IP同一个端口下配置多个HTTPS域名主机

最近需要在一个云服务器上搭建两个不同的网站,配置好nginx.conf后在http域名下测试成功,http://siteA.com 和 http://siteB.com都能正常访问且是访问不同的内容。

但在配置ssl证书、开启Https之后就出现问题了,无论是访问https://siteA.com 还是 https://siteB.com 都是引用了siteA.com 的证书,导致https://siteB.com 无法正常访问。

访问Nginx的官网,上面有解释原因和提供了解决办法:

Configuring HTTPS servers

我尝试了官网介绍的办法,依然存在SSL证书识别错误的问题,最后在官网的基础上自行解决了。具体如下:

造成SSL证书冲突的原因

当我们访问一个https域名时,SSL在浏览器向服务器发送请求前就建立好连接,这个时候nginx还不知道我们请求的是哪个服务器,无奈只能向我们提供默认的服务器证书。

一个古老但稳健的解决办法

是给每一个https服务器分配一个不同IP:

server {
    listen          192.168.1.1:443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    ...
}

server {
    listen          192.168.1.2:443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;
    ...
}

这个明显不符合大众需求,有两个不同IP我还搞什么一个云服务器配置两个域名。

一个更通用的解决办法

是通过TLS服务器名称指示扩展/ TLS Server Name Indication extension(SNI, RFC 6066),让一个IP地址可以运行多个HTTPS服务器。它允许浏览器在SSL握手时传递一个请求的服务器名字,以便nginx知道这次的连接应该使用哪个证书。

要在nginx中使用SNI,需要在编译安装nginx时加上对ssl模块的支持。如果你的nginx是支持的,当你输入nginx -V(如果你没有把nginx添加到环境变量,那就在nginx安装目录的sbin子目录下输入 ./nginx -V ) 命令时应该会看到TLS SNI support enabled 字样。这表明你的nginx是支持一个IP配置多个不同https域名的。
Nginx同一个IP同一个端口下配置多个HTTPS域名主机_第1张图片
如果没有这个字样,表明你的nginx是不支持的,需要重新安装nginx,并把SSL支持添加进去,具体这里不展开,大家自行百度即可。

然后就可以配置nginx.conf以支持两个https域名了:

server {
    listen          443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    ...
}

server {
    listen          443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;
    ...
}

到了这一步,可能很多人都已经成功了,但是我的依然不成功,访问https://siteB.com时依然引用了sitaA.com的SSL证书。

最后我是在siteA.com的server配置中加了重定向语句来解决的:

        if ($host = siteB.com){
        rewrite ^ https://www.siteB.com permanent;
        }

Nginx同一个IP同一个端口下配置多个HTTPS域名主机_第2张图片
至此,总算解决问题。

你可能感兴趣的:(前端相关,nginx,linux,ssl)