具有共享配置和集中证书的 Auzre Web 场出现 SSL 故障

具有共享配置和集中证书的 Auzre Web 场出现 SSL 故障

[抱歉,这个问题有点长,如果相关的话,还有很多额外的信息]

概述

我在 Azure 中 4 VM 负载平衡服务器场上使用 SSL 时遇到问题。如果 HTTPS 请求到达服务器场中的第一台服务器,则一切正常。如果它到达其他 3 台服务器中的任何一台,则调用失败。Chrome 将发出 SSL 协议错误,IE 和 Firefox 只会说无法显示页面。

设置

我在 Azure 上有四台 Windows Server 2012 VM(小型实例,仅用于测试)。这些 VM 位于同一个云服务和可用性集中。已为端口 80 和 443 添加了负载平衡端点(直接服务器返回是不是启用了这些功能)。这四台机器都是通过相同的 PowerShell 脚本设置的,除两台机器外,其他所有机器都完全通过这种方式配置。

每台服务器的 IIS 配置都设置为使用共享配置,该配置通过 DFS 从组中的第一台服务器复制到每台服务器。这是为每台服务器手动配置的,运行良好。

DFS 还用于将 webs 文件夹从第一台服务器复制到其他服务器。

在编写部署脚本后,我还发现了“新”的集中证书功能,因此也在四台服务器上手动安装和配置了该功能。我使用单独服务器上的共享来存储证书文件。

证书请求是在第一个服务器上生成的,我使用 SSL.com 为地址获取了免费的 90 天 SSL 。我在 DNS 中subdomain.domain.com添加了 CNAME 记录以指向 Azure地址。subdomaindomain.comcloudapp

我将 SSL 证书导入第一台服务器,然后再次将其导出subdomain.domain.com.pfx(带密码),并将其复制到证书文件共享中。当检查所有四台服务器上的集中证书时,它们都列出了证书,没有错误图标,表明配置上的密码错误等。

最后,我更改了服务器 1 的绑定,以添加带有主机名的 https subdomain.domain.com,并使用要求指示服务器名称使用集中证书存储选项已检查。检查其他服务器显示绑定已按预期传播。

问题

我添加了一个基本页面,它只是输出处理请求的服务器的名称。如果我打开几个 IE 窗口并访问http://subdomain.domain.com,它们会打印出各种服务器名称,表明 IIS 配置和 Web 文件已正确部署,并且 Azure 负载平衡也在发挥作用。我发现这真的很酷。

但是,当我通过 HTTPS 尝试时,一切都失败了。只有到达第一台服务器的请求成功,其余的请求都崩溃了,并显示“无法显示此页面”或“SSL 协议错误”,具体取决于我使用的浏览器。在服务器 1 上,页面显示正常,证书可见,没有证书错误。

我确信这是某个服务器上的配置问题,但我就是说不出到底是什么问题。我所尝试的大部分操作对我来说都是新事物,因为过去我们曾使用过带有 IIS6 的物理非集群 Windows 2003 服务器。

更令人困惑的是,我昨晚关闭了四台虚拟机,当我今天早上重新启动服务时,服务器 2 现在显然除了服务器 1 之外也响应了 SSL 请求。话虽如此,我昨天也完全关闭了服务器,但之后仍然只有服务器 1 可以工作。

IIS 日志文件没有显示失败的 SSL 请求,只有服务器 1 和 2 上的端口 80 的一堆 200 以及端口 443 的混合 200 和 304。

我已经对 Google 搜索做了一些尽职调查,但没有任何发现。事实上恰恰相反,据我所知,我所做的应该有效。

任何有助于解决此问题的建议都将受到感激。

答案1

我想分享一些步骤,这些步骤应该可以解决 IIS 上的集中式证书存储的大多数问题。集中式证书存储 (CCS) 会创建一个虚假证书绑定,并使用该绑定将 SSL 证书请求传递到 CCS。如果不存在此绑定或同一 IP 地址上有多个绑定,则当客户端尝试连接到启用 SSL 的网站时,您将收到浏览器错误。

考虑以下设置;172.16.0.41启用了 IP 地址和集中式证书存储的 IIS 服务器包含两个域;www.adomain.com并且www.bdomain.com。每个域的 IIS 集中式证书存储中都安装了 PFX 证书包。

通常有两种错误;

问题 1

当浏览器连接到该网站时,会共享错误的证书。例如,www.adomain.com第一次访问 会导致提供正确的证书,但是当浏览器访问 时www.bdomain.com,会返回 的证书www.adomain.com,导致浏览器标记无效证书错误。

解决方案

出现此问题的原因通常是因为多个网站绑定到同一个 IP 地址,并且至少有一个网站没有启用要求服务器名称识别。如果不为共享相同 IP 和端口的所有网站启用此设置,IIS 将无法确定要提供哪个证书,因此第一个获胜政策似乎适用。

这意味着对同一 IIS 服务器上托管的其他网站的后续请求将返回错误的证书。

解决步骤

  1. 确保每个网站都设置为Require Server Name Identification。具体方法是单击 IIS 管理器中的每个网站,选择“绑定...”->“选择 HTTPS 绑定”->“选择编辑”->“检查Require Server Name Identification并确保Use Centralized Certificate Store也已选中”。

  2. 检查服务器上的绑定。从提升的命令框执行netsh http show sslcert

CCS 的绑定应该存在:

SSL Certificate bindings:
------------------------- 

Central Certificate Store    : 443
Certificate Hash             : (null)
Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name       : (null)
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check                  : Enabled
Revocation Freshness Time    : 0
URL Retrieval Timeout        : 0
Ctl Identifier               : (null)
Ctl Store Name               : (null)
DS Mapper Usage              : Disabled
Negotiate Client Certificate : Disabled

请注意,与证书哈希的绑定(null)表明存在 CCS 直通绑定。如果有任何其他绑定正在监听您的服务器的 IP 地址和 SSL 端口(172.16.0.41:443在我们的场景中),则需要将其删除。

  1. 要删除绑定,请键入netsh http delete sslcert <binding>。在我们的场景中,这将是netsh http delete sslcert 172.16.0.41:443,并且应该删除绑定。(null)不应删除 CCS 直通绑定。如果不存在此绑定,请参阅问题 2以下。

  2. 重置 iisiisreset并连接到 Web 服务器上的每个域。应共享正确的证书。您还可以通过重复步骤 2 并确保不IP:PORT存在与您的 SSL 端口和 Web 服务器 IP 的特定绑定来检查绑定。

问题 2

即使确认已启用集中证书存储,证书可见且所有网站都必须使用它,当浏览器连接到该网站时,它仍会抛出Page Cannot be displayedinvalid encryption错误。目标网站不会显示。

在 IE(Edge)中,这通常会表现为建议检查浏览器中是否启用了适当的加密类型。

iisreset或重新启动服务器都不能解决问题。

解决方案

这似乎是 CCS 直通绑定创建过程中的一个错误。启用 CCS 功能时不会在 Web 服务器上创建该绑定,因此传入的证书请求会被悄悄丢弃。

解决步骤

  1. 首先检查集中证书存储是否已启用,并且可以看到其路径中的所有证书。为此,请IISManager选择服务器节点->集中证书(在管理部分下)->编辑功能设置...并确保其已配置并启用。

  2. 检查所有使用通用证书的网站是否已绑定到 CCS。在 IIS 管理器中单击每个网站,选择“绑定...”->“选择 HTTPS 绑定”->“选择编辑”->“检查Require Server Name Identification并确保Use Centralized Certificate Store也已选中”。

  3. 检查是否已创建 CCS 绑定。运行netsh http show sslcert。如果结果为空或(null)不存在直通证书(请参阅问题 1 下的步骤 2 了解 CCS 绑定的样子),则表示尚未启用 CCS 绑定。

    SSL Certificate bindings:
    -------------------------
    
  4. 在 IIS 管理器中,选择一个使用 CCS 的网站,单击“绑定...”->选择“HTTPS 绑定”->选择“编辑”->然后取消选中 Use Centralized Certificate Store取消选中 Require Server Name Identification

SSL certificate下拉菜单中,选择服务器默认WMSVC证书并单击OK。保持Site Bindings窗口打开。

  1. 切换回提升的命令提示符并运行netsh http show sslcert。这将产生如下绑定:

    SSL Certificate bindings:
    ------------------------- 
    IP:port                      : 172.16.0.41:443
    Certificate Hash             : 64498c920fecb31b8f7ccbdac2fa2baa2ec4f19a
    Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
    Certificate Store Name       : My
    Verify Client Certificate Revocation : Enabled
    Verify Revocation Using Cached Client Certificate Only : Disabled
    Usage Check                  : Enabled
    Revocation Freshness Time    : 0
    URL Retrieval Timeout        : 0
    Ctl Identifier               : (null)
    Ctl Store Name               : (null)
    DS Mapper Usage              : Disabled
    Negotiate Client Certificate : Disabled
    
  2. 返回窗口Site Bindings并恢复步骤 4 中的更改。启用Require Server Name IndicationUse Centralized Certificate Store并单击OK

  3. 切换回提升的命令提示符并netsh http show sslcert再次运行 - 如果上帝对你微笑 - 集中式证书存储绑定应该已经出现,取代当前绑定:

      SSL Certificate bindings:
      -------------------------
    
      Central Certificate Store    : 443
      Certificate Hash             : (null)
      Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
      Certificate Store Name       : (null)
      Verify Client Certificate Revocation : Enabled
      Verify Revocation Using Cached Client Certificate Only : Disabled
      Usage Check                  : Enabled
      Revocation Freshness Time    : 0
      URL Retrieval Timeout        : 0
     Ctl Identifier               : (null)
     Ctl Store Name               : (null)
     DS Mapper Usage              : Disabled
     Negotiate Client Certificate : Disabled
    

如果您看到上述证书与(null)值绑定Certificate Hash,则表明它已起作用并且现在应该启用 CSS 传递。

  1. 启动浏览器并尝试通过安全套接字(HTTPS)连接到服务器上的域,一切都应该顺利。

重要笔记

  • 您需要在 Web 场中的每个 Web 服务器上重复此过程。应该可以通过 PowerShell 来自动化和检查该过程。

  • 一旦创建了直通绑定,它将被无限期保留(除非您在节点上禁用集中证书支持)。

顺便说一句,此链接包含有关 CCS 在技术层面如何运作的信息,值得一读:https://blogs.msdn.microsoft.com/kaushal/2012/10/11/central-certificate-store-ccs-with-iis-8-windows-server-2012/

我希望这能有所帮助。

相关内容