全部产品
云市场
    在服务器的同一IP地址和端口中绑定多站点但证书不匹配

在服务器的同一IP地址和端口中绑定多站点但证书不匹配

问题描述

问题场景描述满足以下三个条件:

  • 多个站点绑定到Web服务器的同一个IP地址和同一个端口。
  • 对于客户端的请求,服务器可以区分不同的主机头。
  • 已为每一个SSL站点申请并安装了证书,但在浏览网站时,用户获取到证书不匹配的信息。

问题原因

当一个HTTPS请求到达Web服务器时,该HTTPS请求为加密状态,需要相应的服务器证书解密该HTTPS请求。由于每个站点对应的证书不同,因此服务器需要通过请求中的主机头来选择用来解密的证书。但是主机头作为请求的一部分信息,也被作为加密对象,因此Web服务器选择第一个绑定到指定IP地址和端口的站点,使用该站点证书进行解密,导致Web服务器对其他站点请求解密失败从而发生报错。

解决方案

本文提供了三种Web服务器的解决方案,以下是详细内容。

IIS

您可以在IIS服务器中选择以下四种方法解决问题:

  • 绑定到多端口
    将每个HTTPS站点绑定到同一IP地址的不同端口。例如,将HTTPS站点绑定到[$Domain]:[$Port],但是从客户端浏览网页时必须在地址栏中手动指定端口。
    说明
    • [$Domain]为站点域名。
    • [$Port]为指定端口。
  • 绑定到多IP地址
    将每个HTTPS站点绑定到不同IP地址。此时,不存在请求冲突的情况,同时请求中也可以不添加主机头信息,但是该方法的经济成本较高。
  • 通配证书
    各站点采用通配证书,例如site1.marei.comsite2.marei.comsite3.marei.com三个站点可以选择颁发给.marei.com的证书,此时任何访问各站点的请求都可以通过该证书解密。
  • 升级IIS
    将IIS版本升级到IIS8,IIS8中支持SNI(Server Name Indication)功能,服务器可以从请求中提取出相应的主机头从而获取相应的证书。关于SNI的开启方式请参见SSL Scalability

Nginx

在Nginx服务器中,可通过增加一个虚拟主机的方式,完成多站点绑定到服务器同一个IP地址和同一个端口,请参考以下操作方法:

  1. 登录Nginx服务器,执行以下命令,编辑Nginx配置文件。
    vim [$Nginx_Dir]/conf/nginx.conf
    说明:[$Nginx_Dir]为Nginx的安装目录,默认为/usr/local/nginx
  2. 在配置文件中编辑成以下内容。
    server {
        listen 443;
        server_name [$Domain1];
        ssl on;
        ssl_certificate [$Certificate_Path1];
        ssl_certificate_key [$Key_Path1];
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers [$Ciphers_Suite1];
        ssl_prefer_server_ciphers   on;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server { listen 443; server_name [$Domain2]; ssl on; ssl_certificate [$Certificate_Path2]; ssl_certificate_key [$Key_Path2]; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers [$Ciphers_Suite2]; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
    说明
    • [$Domain1]:第一个站点的域名。
    • [$Domain2]:第二个站点的域名。
    • [$Certificate_Path1]:第一个站点的证书文件路径。
    • [$Certificate_Path2]:第二个站点的证书文件路径。
    • [$Key_Path1]:第一个站点的密钥文件路径。
    • [$Key_Path2]:第二个站点的密钥文件路径。
    • [$Ciphers_Suite1]:第一个站点配置的加密套件,可参考以下加密套件。
      AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL
    • [$Ciphers_Suite2]:第二个站点配置的加密套件。
    • 若有更多站点需要配置,则在本步骤涉及的配置内容后,追加server区域的配置信息。
    • 可根据现场实际情况,在每个站点配置的location区域中,配置不同的文件目录。

Apache

  1. 登录Apache服务器,执行以下命令,编辑ssl.conf配置文件。
    vim [$Apache_Dir]/conf.d/ssl.conf
    说明
    • [$Apache_Dir]为Apache的安装目录,默认为/etc/httpd
    • 若没有找到ssl.conf配置文件,则请执行yum install mod_ssl -y命令,下载SSL相关模块。
  2. 在配置文件中编辑成以下内容。
    Listen 443
    NameVirtualHost *:443
    <VirtualHost *:443>
      ……
    ServerName [$Domain1]
    SSLCertificateFile     [$Certificate_Path1];
    SSLCertificateKeyFile  [$Key_Path1];
    SSLCertificateChainFile  [$Certificate_Chain1];
      ……
    </VirtualHost>
    <VirtualHost *:443>
      ……
    ServerName [$Domain1]
    SSLCertificateFile     [$Certificate_Path2];
    SSLCertificateKeyFile  [$Key_Path2];
    SSLCertificateChainFile  [$Certificate_Chain2];
    说明
    • [$Certificate_Chain1]:第一个站点的中级证书捆绑包路径。
    • [$Certificate_Chain2]:第二个站点的中级证书捆绑包路径。
    • 在Apache V2.4.8及更高版本中,SSLCertificateChainFile的配置信息已被SSLCACertificatePath的配置信息替换。

适用于

  • SSL证书

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。