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

解决方法

  1. 将每个https站点绑定到不同的端口。但是这样的话客户端浏览网页时必须手动指定端口,例如 https://domain.com:444
  2. 为每个站点分配一个独立的ip,这样冲突就解决了,甚至主机头也不用添加了。
  3. 使用通配证书。我们采用通配证书颁发给.domain.com,这样任何访问该domain的请求均可以通过该证书解密,证书匹配错误也就不复存在了。
  4. 升级为IIS8,IIS8中添加的对于SNI(Server Name Indication)的支持,服务器可以通请求中提取出相应的主机头从而找到相应的证书。

方案分析

  1. 明显不太现实,我们不能让用户在访问我们的网站时还要指定端口号,一来不太好记,二来用户体验不好;
  2. 虽然可行,但由于我们使用的是阿里云的服务器,是固定IP,没办法再给服务器再分配一个IP,故该方案不适合我们的场景;
  3. 虽然可行,但我们使用的是域名型SSL证书,而且要购买通配型SSL证书的话,价格也比较贵,故该方案不适合我们的场景;
  4. 至少需要使用Windows Server 2012,也就是IIS版本至少要是IIS8,不是IIS8的可以自行升级为IIS8,在IIS8中,因为添加了对SNI的支持(具体概念及原理,读者可自行查阅相关资料,这里就不多说),所以可以很方便的解决我们所面临的问题。

操作步骤

安装服务器证书,进入IIS,点击主机名,选择服务器证书,点击右侧导入,选择自己的证书文件进行导入。导入的时候,一定要勾选“允许导出证书”,否则会部署不成功。

多HTTPS配置

在第一个网站绑定SSL证书,不要绑定IP地址填写主机名(作为默认的SSL证书,开启SNI需要配置有默认SSL证书),绑定对应域名的证书文件,如下图:

多HTTPS配置

然后选择第二个网站,绑定对应的SSL证书,这时您就需要填写主机名,同时勾选上“需要服务器名称指示(N)”,选择对应的证书文件,如下图:

多HTTPS配置