12
服务器多站点多域名https实现

假设有这样一个场景,我们有多个站点(例如site1.marei.com,site2.marei.com和site3.marei.com)绑定到同一个ip:port,并区分不同的主机头。我们为每一个ssl站点申请并安装了证书。在浏览网站时,用户仍看到证书不匹配的错误。

  • 问题原因

当一个https的请求到达iis服务器时,https请求为加密状态,需要拿到相应的服务器证书解密请求。由于每个站点对应的证书不同,服务器需要通过请求中不同的主机头来判断需要用哪个证书解密,然而主机头作为请求的一部分也被加密。最终iis只好使用第一个绑定到该ip:port的站点证书解密请求,从而有可能造成对于其他站点的请求失败而报错。

  • 凯发k8旗舰厅app下载的解决方案

    1. 第一种凯发k8旗舰厅app下载的解决方案将每个https站点绑定到不同的端口。但是这样的话客户端浏览网页时必须手动指定端口,例如 https://site.domain.com:444

    2. 第二种凯发k8旗舰厅app下载的解决方案是为每个站点分配一个独立的ip,这样冲突就解决了,甚至主机头也不用添加了。

    3. 第三种凯发k8旗舰厅app下载的解决方案是使用通配证书。我们采用通配证书颁发给.domain.com,对于我们的示例中,应该采用颁发给.marei.com的证书,这样任何访问该domain的请求均可以通过该证书解密,证书匹配错误也就不复存在了。

    4. 第四种凯发k8旗舰厅app下载的解决方案是升级为iis8,iis8中添加的对于sni(server name indication)的支持,服务器可以通请求中提取出相应的主机头从而找到相应的证书。

      sni开启方式请参考

打开 nginx 安装目录下 conf 目录中打开 nginx.conf 文件,找到

    server {

        listen 443;

        server_name domain1;

        ssl on;

        ssl_certificate 磁盘目录/订单号1.pem;

        ssl_certificate_key 磁盘目录/订单号1.key;

        ssl_session_timeout 5m;

        ssl_protocols tlsv1 tlsv1.1 tlsv1.2; 

        ssl_ciphers aesgcm:all:!dh:!export:!rc4: high:!medium:!low:!anull:!enull;

        ssl_prefer_server_ciphers   on;

        location / {

            root   html;

            index  index.html index.htm;

        }

    }

在上述基础上,再添加另一段配置

    server {

        listen 443;

        server_name dommain2;    #第二个域名

        ssl on;

        ssl_certificate 磁盘目录/订单号2.pem;

        ssl_certificate_key 磁盘目录/订单号2.key;

        ssl_session_timeout 5m;

        ssl_protocols tlsv1 tlsv1.1 tlsv1.2;

        ssl_ciphers aesgcm:all:!dh:!export:!rc4: high:!medium:!low:!anull:!enull;

        ssl_prefer_server_ciphers on;

        location / {

            root html;

            index index.html index.htm;

        }

    }


通过上述配置在nginx中支持多个证书

    listen 443

    namevirtualhost *:443

   

      ……

    servername www.example1.com

    sslcertificatefile     common.crt;

    sslcertificatekeyfile  common.key;

    sslcertificatechainfile  ca.crt

      ……


      ……

    servername www.example2.com

    sslcertificatefile     common2.crt;

    sslcertificatekeyfile  common2.key;

    sslcertificatechainfile  ca2.crt

      ……