我们的服务遍布中国

我们的服务遍布中国
乃至世界

光网所服务的品牌地域与城市
北京 天津 上海 广州 深圳 香港 厦门 江苏 浙江 山东
重庆 长沙 武汉 成都 西安 宁夏 丽江 青海 云南 乌鲁木齐
黑龙江 内蒙古 河北 ...
光网服务与合作的全球各地
美国 加拿大 德国 法国 英国 瑞士 意大利 荷兰
印度 日本 韩国 ...

不论你的品牌在何处
我们都可以提供完善的服务与帮助

致电

0512-56969630
您所在的位置:首页 > SSL证书

服务器多站点多域名HTTPS实现

发布时间:2014/10/7 8:15:24 浏览:97打印字号:

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

1. IIS中实现

  • 问题原因

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

  • 解决方案

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

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

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

    4. 第四种解决方案是升级为IIS8,IIS8中添加的对于SNI(Server Name Indication)的支持,服务器可以通请求中提取出相应的主机头从而找到相应的证书。

      SNI开启方式请参考http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-server-name-indication-sni-ssl-scalability

2. Nginx中实现

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

server {
    listen 443;
        server_name domain1;
            ssl on;
                ssl_certificate 证书域名.pem;
                    ssl_certificate_key 证书域名.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 证书域名.pem;
                ssl_certificate_key 证书域名.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中支持多个证书