使用IIS的同一服务器上的SNI和通配符SSL证书


12

我想托管一个网站,该网站应该侦听子域(例如sub.domain.com)以及多个生活在IIS和SSL二级域名(例如domain2.com,domain3.com)之下的网站。

对于具有子域的网站,我具有通配符证书(* .domain.com),并且我还具有专门针对其他站点(domain2.com和domain3.com)的证书。

可以在相同的IIS上托管这样的设置吗(如果重要的话,可以使用Azure Cloud Service Web角色)吗?

问题恰好是titobf 在这里解释的:理论上,为此,我们需要使用SNI进行绑定,并为domain2 / 3.com指定主机,然后为* .domain.com指定具有* host的通用网站。但是在实践中,无论是否设置了绑定,如果所有网站都在该网站上,它也会收到对domain2 / 3.com的所有请求(尽管据称仅是在万不得已的情况下才进行匹配)。

任何帮助,将不胜感激。

仍未解决

不幸的是,我无法解决这个问题:它似乎只能以极其复杂的方式解决,例如创建一个位于IIS和Internet之间的软件(基本上就是防火墙)并修改传入的请求(在SSL握手之前!)。 )以允许出现这种情况。我非常有信心,无论如何,IIS都不可能做到这一点,即使是从本机模块也是如此。

我必须澄清:我们使用Azure云服务,因此还有一个限制,即我们不能使用多个IP地址(请参阅:http : //feedback.azure.com/forums/169386-cloud-services-web-and -workerrole / suggestions / 1259311-multiple-ssl-and-domains-to-one-app)。如果您可以将多个IP指向服务器,则不会出现此问题,因为您也可以为IP创建绑定,并且这些绑定可以一起使用通配符绑定。更具体地说,您需要为通配符站点提供一个IP(但是由于您现在拥有一个单独的IP,因此您不必配置通配符主机名绑定),并且为所有其他非通配符提供一个IP。

实际上,我们的解决方法是使用非标准SSL端口8443。因此,SNI绑定实际上绑定到了此端口,因此它可以与其他绑定一起使用。不好,但是对我们来说是一个可以接受的解决方法,直到您可以将多个IP用作Web角色。

现在无法使用的绑定

第一个https绑定是具有简单证书的SNI,第二个不是具有通配符证书的SNI。

http站点以及SNI https站点都可以使用,但是带有通配符绑定的站点提供了“ HTTP错误503。服务不可用”。(没有任何更多信息,没有失败的请求跟踪或事件日志条目)。 绑定

终于让它基本工作了

启用ETW跟踪日志(如Tobias所述)表明,根错误如下:

由于以下原因,请求(请求ID 0xF500000080000008)被拒绝:UrlGroupLookupFailed。

据我了解,这意味着http.sys无法将请求路由到任何可用的端点。

通过检查已注册的端点,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绑定将其删除。


您绝对应该能够使用SNI在IIS上执行此操作,而无需诉诸多个IP或非标准端口。
乔·斯尼德曼

您是说IIS应该支持这一点吗?我同意 :-)。
Piedone 2014年

我完全同意你,Piedone。IIS(或更确切地说是http.sys)不支持将通配符证书(作为默认SSL证书)和多个具体证书与SNI AS EXPECTED结合使用,我感到非常失望。自2012年以来,这个问题众所周知,您可以在此处看到:forums.iis.net/t/1192170.aspx。我刚刚写了一封电子邮件给Microsoft,希望很快得到反馈。
Tobias J.

谢谢托比亚斯。微软答复后,请回到这里。
Piedone 2014年

2
可能http.sys拒绝了该请求,因此IIS中未记录任何失败请求。创建一个http.sys ETW跟踪日志:1)启动跟踪日志。运行:logman start httptrace -p Microsoft-Windows-HttpService 0xFFFF -o httptrace.etl -ets2)执行503请求3)停止跟踪日志。运行:logman stop httptrace -ets4)将跟踪日志写入文件。运行:tracerpt.exe httptrace.etl -of XML -o httptrace.xml5)检查xml文件中503的原因,并将其发布在此处。
Tobias J.

Answers:


6

巴里斯是对的!在IP:PORT绑定上配置的SSL证书(例如:100.74.156.187:443)始终在http.sys中具有优先权!因此解决方案如下:

不要为通配符回退证书配置IP:443绑定,而是为其配置*:443绑定(*表示“所有未分配”)

如果已在Azure云服务SSL终结点上配置了通配符证书(如我所述),则必须将由Azure云服务运行时(IISconfigurator.exe)创建的SSL绑定从IP:PORT更改为*:PORT。我在Web角色的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());
        }
    }
}

以下屏幕截图显示了我们的云服务的有效配置。请不要对非标准端口感到困惑。屏幕截图来自仿真的云服务。

正常的IIS配置

还要提到的另一件事:不要将所有绑定更改为*,因为HTTP(端口80)绑定仅与已部署的云服务中的IP:PORT绑定一起使用。其他绑定到IP:80,所以*:80不起作用,因为*代表“ all unassigned”(所有未分配),并且IP已在http.sys中的其他位置分配。


感谢您的详细回答。我更新了我的问题:我记得现在我可能没有进行此设置,因为我遇到了与现在相同的错误。
Piedone 2014年

4

确保包罗万象的绑定不是IP:Port类型。如果不要求SNI而存在HTTPS绑定的IP:Port绑定,则该绑定将始终优先。对于所有情况,请使用*:Port绑定(*是所有未分配的)。


谢谢,但是正如您在我的描述中所看到的那样,我最初尝试设置不带端口的SNI绑定,但是由于此操作不起作用,我最终使用了自定义端口绑定。
Piedone 2014年

通过端口,我认为您是指IP。没有端口就无法绑定。Inetmgr不允许这样做。对于SNI绑定,您可以使用特定的IP或“所有未分配的”,结果将是相同的。您拥有通配符证书的是“全部捕获”绑定,该绑定必须位于“所有未分配”上,而不是在特定IP上。
bariscaglar 2014年

我的意思是端口,但我想说“非标准端口”。就像您说的那样,未指定IP,但该IP仍然不起作用,另请参见Tobias的链接。有两种方法可以解决IIS的这种限制:使用自定义端口或不同于其他绑定的IP:在Azure云服务上,后者不可用,因此我们不再使用自定义端口。
Piedone 2014年

bariscaglar是Microsoft开发人员(在IIS上工作),我与他进行了非常友好而有益的对话!Thx Baris!我们一起分析了行为,并得出结论:所描述的行为是http.sys的期望行为。但是有一个不错的解决方法。有关详细信息,请参见我的答案。
Tobias J.

只是给所有阅读者的注释,我最近发现,如果您使用Azure门户为远程桌面配置服务(或更改证书配置),则可能导致IP:Port绑定自动创建并破坏所有SNI 。对于该特定问题,我没有解决方案。它发生在RoleEnvironment.Changed之后,所以我无法在WebRole.cs中捕获它。
麦克,

1

IIS确实支持SNI,即使在天蓝色的云服务Web角色中也是如此,尽管您无法通过门户网站进行配置,并且如果在部署后在盒子上进行配置,它将在下次部署中删除。解决方案是使配置自动化。在这里查看详细信息:

http://www.vic.ms/microsoft/windows-azure/multiples-ssl-certificates-on-windows-azure-cloud-services/


谢谢,但是正如我所解释的,SNI本身没有问题(我正在使用它),而是通配符主机名匹配在IIS中的工作方式。
Piedone 2014年

本文不再存在,但在这里是Web存档上:web.archive.org/web/20151020041907/http
Mike
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.