SNI 和通配符 SSL 证书与 IIS 位于同一台服务器上

Pie*_*one 12 iis ssl ssl-certificate sni azure

我想托管一个网站,该网站应该侦听子域(例如 sub.domain.com)以及多个位于具有 IIS 和 SSL 的二级域(例如 domain2.com、domain3.com)下的网站。

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

这样的设置是否可以托管在同一个 IIS 上(如果这很重要,在 Azure 云服务 Web 角色中)?

问题正是titobf在此处解释的:理论上,为此我们需要使用SNI进行绑定,为domain2/3.com指定主机,然后使用*主机为*.domain.com指定一个包罗万象的网站。但实际上,无论绑定如何设置,如果万能网站在它上面,它也会收到对 domain2/3.com 的所有请求(尽管据说它只是作为最后的手段才匹配)。

任何帮助,将不胜感激。

仍未解决

不幸的是,我无法解决这个问题:它似乎只能以极其复杂的方式解决,比如创建一个位于 IIS 和 Internet 之间的软件(因此基本上是一个防火墙)并修改传入的请求(在 SSL 握手发生之前! ) 来允许场景。我相当有信心这在 IIS 中是不可能的,无论如何,甚至从本机模块也不可能。

我必须澄清:我们使用 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 创建绑定,并且这些绑定将与通配符绑定一起使用。更具体地说,您需要一个用于通配符站点的 IP(但由于您现在拥有一个单独的 IP,因此您不必配置通配符主机名绑定)和另一个用于所有其他非通配符站点的 IP。

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

现在非工作绑定

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

http 站点和 SNI https 站点一样有效,但具有通配符绑定的站点会给出“HTTP 错误 503。该服务不可用”。(没有任何进一步的信息,没有失败的请求跟踪或事件日志条目)。 绑定

终于让它基本工作了

启用像 Tobias 描述的 ETW 跟踪日志显示根错误如下:

请求(请求 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)
Run Code Online (Sandbox Code Playgroud)

netsh http delete urlacl url=https://IP:443/最终启用了我的 SSL 绑定来删除它。

Tob*_* J. 6

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

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

如果您在 Azure 云服务 SSL 端点上配置了通配符证书(就像我一样),则必须将 Azure 云服务运行时 (IISconfigurator.exe) 创建的 SSL 绑定从 IP:PORT 更改为 *:PORT。我在我的网络角色的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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

工作 IIS 配置

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


小智 5

确保您的包罗万象的绑定不是 IP:Port 类型。当 HTTPS 绑定存在 IP:端口绑定但不需要 SNI 时,该绑定将始终优先。对于您的包罗万象的情况,请使用 *:Port 绑定(* 表示全部未分配)。