我有多个网站在我的IIS上运行,现在对于一个网站(SiteB),我们需要支持ssl请求。我已经为网站启用了编辑绑定,但问题是,当我选择协议SSL编辑绑定主机名字段被禁用时,无法设置主机名来响应https请求,这导致我的IIS的所有站点如果被请求https://加载siteB的网站。
例如我的bidings是下一个
Site A
IP Port HostName
* 80 www.sitea.com
Site B
IP Port Hostname
* 443 www.siteb.com
* 80 www.siteb.com
如果我在浏览器中输入https://www.siteb.com,它可以正常工作,但如果我在浏览器中输入https://www.sitea.com, siteb网页加载了sitea的主机名。
如何使我的IIS上只有https://www.siteb.com响应https请求?
我也试过命令appcmd,但它不工作。
appcmd set site /site.name:{sitB} /bindings.[protocol='https',bindingInformation='*:443:*'].bindingInformation:*:443:siteB.com
谢谢你的帮助。
根本问题
这个意外的行为与其说是由于IIS,不如说是由于web加密协议。
两种主要的web加密协议是SSL和TLS。这两种协议在向服务器传递任何请求信息之前都会协商一个安全连接。这意味着,对于安全请求,服务器直到建立安全连接之后才真正了解主机名。
已经创建了TLS和SSL的扩展来解决这个限制。它被称为SNI(服务器名称标识)。问题是这个扩展需要在服务器和客户端机器上都得到支持。目前对客户端浏览器的支持有些参差不齐。有关浏览器列表,请参阅SNI文章。
IIS对问题的处理
由于上面提到的主机名限制,IIS不允许您将主机名绑定到HTTPS绑定。IIS无法将HTTPS请求路由到特定的主机名,因为它在第一次开始协商连接时不知道被请求的主机名。
一旦IIS与客户端协商了一个安全连接,并了解到他们请求的主机名是一个网站,而不是一个与HTTPS绑定(例如对https://sitea.com的请求)IIS可以返回一个失败代码或尝试优雅地失败。IIS选择后者,并尝试通过为站点提供HTTPS绑定来优雅地失败,即使用户请求的是另一个站点。
解决方案/工作区
- 创建一个重写规则,将所有不安全网站的HTTPS请求重定向到HTTP。
- 升级到IIS 8使用SNI扩展。然后要求访问者升级到支持SNI的浏览器。
- 让您的安全站点在接收到不同域的请求时返回错误消息。
- 通过IP地址而不是主机名绑定,因为IIS可以通过IP地址路由HTTPS请求
引用
我的大部分信息来自维基百科关于SNI的文章
我们运行多个需要SSL的站点的web服务器,没有问题。
如果我正确理解了你的问题——你需要设置一个绑定而不是主机名——这是行不通的。因此,对于我们托管的每个启用ssl的站点,我们需要一个不同的外部IP地址。然后,在IIS中设置站点时输入该IP地址作为绑定。