我想主持一个网站,应该听取子域名(如sub.domain.com)与多个网站,住在二级域名(如domain2.com,domain3.com)与IIS和SSL。
对于具有子域名的网站,我有一个通配符证书(*。domain.com),我也有专门针对其他网站(domain2.com和domain3.com)的证书。
可以将这样的设置托pipe在同一个IIS上(如果这很重要,则在Azure云服务Webangular色中)?
问题正是titobf 在这里解释的 :从理论上讲,我们需要使用SNI进行绑定,为domain2 / 3.com指定主机,然后为* .domain.com指定主机。 但是在实践中,不pipe如何设置绑定,如果所有网站都处于打开状态,它也会收到所有对domain2 / 3.com的请求(虽然据说它只是作为最后一招)。
任何帮助,将不胜感激。
仍然没有解决
不幸的是,我无法解决这个问题:它似乎只能以非常复杂的方式解决,比如创build一个位于IIS和Internet之间(基本上是防火墙)的软件,并修改传入的请求(在SSL握手发生之前! )以允许该场景。 我相当有信心,这是不可能的,无论如何,甚至不从本地模块。
我必须澄清:我们使用Azure云服务,所以我们有一个进一步的约束,我们不能使用多个IP地址(请参阅: http : //feedback.azure.com/forums/169386-cloud-services-web-and -worker-role / suggestions / 1259311-multiple-ssl-and-domains-to-one-app )。 如果您可以将多个IP指向您的服务器,那么您就不会遇到这个问题,因为您也可以为IP创build绑定,并且这些将一起使用通配符绑定。 更具体地说,您需要通配符站点的IP(但由于您现在拥有单独的IP,因此您不必configuration通配符主机名绑定),而为所有其他非通配符configuration另一个IP。
其实我们的解决方法是使用非标准的SSL端口8443.所以SNI绑定实际上绑定到这个端口,因此它和其他绑定一起工作。 不好,但是可以接受的解决方法,直到你可以使用多个IPangular色。
现在是非工作绑定
第一个https绑定是带有简单证书的SNI,第二个不是SNI,带有通配符证书。
http站点和SNI https站点一样工作,但带有通配符绑定的站点提供了“HTTP错误503.服务不可用”。 (没有任何进一步的信息,没有失败的请求跟踪或事件日志条目)。 
最后得到它基本上工作
如Tobias所述,启用ETW跟踪日志显示根错误如下:
请求(请求ID 0xF500000080000008)由于原因而被拒绝:UrlGroupLookupFailed。
据我了解这意味着http.sys不能将请求路由到任何可用的端点。
使用netsh http show urlacl检查注册的端点netsh http show urlacl确实有一些注册为端口443的东西:
Reserved URL : https://IP:443/ User: NT AUTHORITY\NETWORK SERVICE Listen: Yes Delegate: No SDDL: D:(A;;GX;;;NS)
删除这与netsh http delete urlacl url=https://IP:443/终于启用我的SSL绑定。
巴里是对的! 在IP:PORT绑定(例如:100.74.156.187:443)上configuration的SSL证书始终优先于http.sys! 所以解决办法如下:
不要为通配符后备证书configurationIP:443绑定,但为其configuration*:443绑定(*表示“全部未分配”) 。
如果您在Azure云服务SSL端点上configuration了通配符证书(就像我一样),则必须将由Azure Cloud Service Runtime(IISconfigurator.exe)创build的SSL绑定从IP:PORT更改为*:PORT。 我在我的webangular色的OnStart中调用以下方法:
public static void UnbindDefaultSslBindingFromIp() { Trace.TraceInformation(">> IISTenantManager: Unbind default SSL binding from IP"); using (var serverManager = new Microsoft.Web.Administration.ServerManager()) { try { var websiteName = string.Format("{0}_Web", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CurrentRoleInstance.Id); var site = serverManager.Sites[websiteName]; var defaultSslBinding = site.Bindings.Single(b => b.IsIPPortHostBinding && b.Protocol == "https"); defaultSslBinding.BindingInformation = string.Format("*:{0}:", defaultSslBinding.EndPoint.Port); serverManager.CommitChanges(); } catch (Exception ex) { Trace.TraceError(ex.ToString()); } } }
以下屏幕截图显示了我们云服务的工作configuration。 请不要混淆非标准端口。 屏幕截图来自仿真的云服务。

还有一件事要注意:不要将所有绑定改为*,因为HTTP(端口80)绑定只能在部署的云服务中使用IP:PORT绑定。 其他东西绑定到IP:80所以*:80不起作用,因为*代表“全部未分配”,IP已经分配给http.sys中的其他地方。
确保你的catch-all绑定不是IP:Porttypes。 当一个HTTPS绑定存在一个IP:端口绑定而不需要SNI时,该绑定总是优先的。 对于你的全部情况,使用*:端口绑定(*为全部未分配)。
IIS确实支持SNI,即使在azure色的云服务Webangular色中也是如此,尽pipe无法通过门户进入configuration,如果在部署之后在框中执行,则会在下一次部署时被抹掉。 解决scheme是自动configuration。 看看这里的细节: