十一月 19, 2017 · SSL Windows

IIS7绑定通配符域名时无法自定义主机头的问题

SNI

服务器名称指示(英语:Server Name Indication,简称 SNI)是一个扩展的TLS计算机联网协议,在该协议下,在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。这允许服务器在相同的IP地址和TCP端口号上呈现多个证书,并且因此允许在相同的IP地址上提供多个安全(HTTPS)网站(或其他任何基于TLS的服务),而不需要所有这些站点使用相同的证书。它与HTTP/1.1基于名称的虚拟主机的概念相同,但是用于HTTPS。所需的主机名未加密,因此窃听者可以查看请求的网站。 为了使SNI协议起作用,绝大多数访问者必须使用实现它的Web浏览器。使用未实现SNI浏览器的用户将被提供默认证书,因此很可能会收到证书警告。

IIS对SNI的支持问题

IIS在8.0之前不支持SNI特性,具体请查看IIS 8.0 Server Name Indication (SNI): SSL Scalability
最近购买了一个通配符证书需要配置到某服务器的不同站点上,服务器是Server 2008R2系统,自带IIS版本是7.0,而这个版本不支持SNI特性,所以只能另辟蹊径实现SNI类似功能。


历经九九八十一难,漂洋过海取得真经。


APPCMD.exe

安装IIS后,C:\windows\system32\inetsrv\目录下有appcmd.exe可执行程序。实现SSL自定义主机头功能就靠它了。

准备工作

首先我们先添加一条HTTPS绑定,选择端口444,证书选择该网站的证书。这里主机头一栏在选择https协议后变成灰色无法自定义,我们先不理会。

假设我们需要定义的主机头为 www.example.com。

运行命令


cd c:\windows\system32\inetsrv\appcmd.exe


appcmd set site /site.name: con /bindings.[protocol='https',bindingInformation='*:444:'].bindingInformation:*:443: www.example.com



site.name: con con是站点名

[protocol='https',bindingInformation='*:444:'] 去匹配现有绑定记录, IP:端口号:主机头

bindingInformation:*:443: www.example.com 上面匹配到了之后就改成设定值,IP:端口号:主机头

通过上面的命令我们明白了就是通过appcmd找到现有的绑定记录然后修改这条记录的三要素(IP、端口、主机头),所以通过其他找到记录也是可以的。


appcmd set site "con" /bindings.[protocol='https',bindingInformation='*:444:'].bindingInformation:*:443: www.example.com