排查与 SSL 相关的问题 (服务器证书)

适用于: Internet Information Services 6.0、Internet Information Services 7.0 及更高版本

概述

本文可帮助你排查仅与 Internet Information Services (IIS) 相关的安全套接字层 (SSL) 问题。 它涵盖用于服务器身份验证的服务器证书,不涵盖客户端证书。

如果“客户端证书”部分设置为“需要”,然后遇到问题,则不应参阅本文。 本文仅用于排查 SSL 服务器证书问题。

请务必知道,每个证书包括用于加密) 的公钥 (和用于解密) 的私钥 (。 私钥只有服务器知道。

HTTPS 的默认端口为 443。 假设你在 SSL 握手期间精通 SSL 握手和服务器身份验证过程。

此疑难解答中使用的工具

用于排查各种情况的工具包括:

  • SSLDiag
  • 网络监视器 3.4 或 Wireshark

应用场景

通过 HTTPS 浏览网站时,会看到以下错误消息:

显示消息“Internet Explorer 无法显示网页”的浏览器页面的屏幕截图。

必须检查的第一个先决条件是通过 HTTP 访问网站。 如果不是,则可能是本文未涉及的单独问题。 使用此疑难解答之前,必须让网站在 HTTP 上运行。

现在,假设可以通过 HTTP 访问网站,并在尝试浏览 HTTPS 时显示以前的错误消息。 显示错误消息是因为 SSL 握手失败。 在接下来的几个方案中,可能会详细说明许多原因。

方案 1

检查服务器证书是否具有与之对应的私钥。 请参阅“证书”对话框的以下屏幕截图:

“证书”对话框的两个屏幕截图。一个没有私钥。另一个显示一条消息,指出私钥与证书相对应。

解决方案

如果缺少私钥,则需要获取包含私钥的证书,该私钥实质上是 。PFX 文件。 下面是一个命令,你可以尝试运行该命令来将私钥与证书相关联:

C:\>certutil - repairstore my "[U+200E] 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33"

显示 certutil 语法的命令控制台的屏幕截图。

如果关联成功,则会看到以下窗口:

命令控制台的屏幕截图,其中显示了命令成功完成的消息。

在此示例中, 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33 是证书的指纹。 获取指纹:

  1. 打开证书。
  2. 选择“ 详细信息 ”选项卡。
  3. 向下滚动以查找指纹部分。
  4. 选择指纹部分,然后单击下面的文本。
  5. 执行 Ctrl+A ,然后按 Ctrl+C 以选择并复制它。

显示“详细信息”选项卡的“证书”对话框的屏幕截图。指纹值已突出显示。

注意

命令 certutil 可能并不总是成功。 如果此操作失败,则需要从证书颁发机构获取包含私钥的证书, (CA) 。

方案 2

在此方案中,假设你有一个包含私钥的服务器证书安装在网站上。 但是,你仍会看到 方案 1 中显示的错误。 你仍无法通过 HTTPS 访问网站。

解决方案

  1. 在服务器上下载并安装 SSL 诊断 工具。

  2. 如果你有包含私钥的证书,但你仍然无法访问该网站,请尝试运行此工具或检查系统事件日志,了解与 SChannel 相关的警告或错误。

    运行 SSLDiag 工具时,可能会看到以下错误消息:

    你有一个与此证书对应的私钥,但 CryptAcquireCertificatePrivateKey 失败。

    “SSL 诊断”窗口的屏幕截图。突出显示失败消息。

    此外,系统事件日志中将显示以下 SChannel 警告:

    Event Type: Error 
    Event Source: Schannel 
    Event Category: None 
    Event ID: 36870 
    Date: 2/11/2012 
    Time: 12:44:55 AM 
    User: N/A 
    Computer: 
    Description: A fatal error occurred when attempting to access the SSL server credential private key. The error code returned from the cryptographic module is 0x80090016. 
    

    此事件或错误表示获取证书的私钥时出现问题。 因此,请尝试以下步骤来解决警告:

  3. 首先,验证 MachineKeys 文件夹的权限。 所有私钥都存储在 MachineKeys 文件夹中,因此请确保具有必要的权限。

  4. 如果权限已到位,并且问题仍未解决,则证书可能存在问题。 它可能已损坏。 以下 SChannel 事件日志中可能会看到0x8009001a错误代码:

    Event Type: Error 
    Event Source: Schannel 
    Event Category: None 
    Event ID: 36870 
    Date: 2/11/2012 
    Time: 12:44:55 AM 
    User: N/A 
    Computer: 
    A fatal error occurred when attempting to access the SSL server credential private key. The error code returned from the cryptographic module is 0x8009001a. 
    
  5. 检查网站是否使用测试证书。

  6. 备份现有证书,然后将其替换为自签名证书。

  7. 尝试使用 HTTPS 访问网站。 如果有效,则之前使用的证书已损坏,必须将其替换为新的工作证书。 有时,问题可能不出在证书上,而与颁发者有关。 SSLDiag 中可能会出现以下错误:

    “SSL 诊断”窗口的屏幕截图,其中突出显示了错误消息。

    CertVerifyCertificateChainPolicy 如果根 CA 证书不是受信任的根证书,将失败并显示 CERT_E_UNTRUSTEDROOT (0x800b0109)

  8. 若要修复此错误,请将 CA 的证书添加到服务器上的“我的计算机帐户”下的“受信任的根 CA”存储中。 还可能会收到以下错误:

    CertVerifyCertificateChainPolicy 返回错误 -2146762480 (0x800b0110) 。

  9. 若要解决此错误,请执行以下步骤检查证书的使用类型:

    1. 打开证书。
    2. 选择“ 详细信息 ”选项卡。
    3. 选择 “编辑属性...”
    4. 在“ 常规 ”选项卡下,确保选中“ 为此证书启用所有用途 ”选项,最重要的是,列表中应存在 服务器身份验证

    屏幕截图显示了“证书属性”对话框的一部分,其中选择了“为此证书启用所有用途”。

场景 3

前两种方案有助于检查证书的完整性。 确认证书没有问题后,可解决一个相当大的问题。 但是,如果网站仍然无法通过 HTTPS 访问呢? 检查网站的 HTTPS 绑定,并确定它侦听的端口和 IP。

解决方案

  1. 运行以下命令,确保没有其他进程正在侦听网站使用的 SSL 端口。

    netstat -ano" or "netstat -anob
    
  2. 如果有另一个进程侦听该端口,则检查该进程使用该端口的原因。

  3. 如果网站可访问,请尝试将 IP-Port 组合更改为检查。

场景 4

现在,你可以确保在网站上安装了适当的工作证书,并且没有其他进程使用此网站的 SSL 端口。 但是,通过 HTTPS 访问网站时,仍可能看到“无法显示页面”错误。 当客户端连接并启动 SSL 协商时, HTTP.sys 在其 SSL 配置中搜索客户端连接到的“IP:Port”对。 SSLHTTP.sys 配置必须包含证书哈希和证书存储区的名称,然后 SSL 协商才能成功。 问题可能出在 。HTTP.SYS SSL Listener

HTTP.sys 注册的证书哈希可能为 NULL,也可能包含无效的 GUID。

解决方案

  1. 执行以下命令:

    IIS 6: "httpcfg.exe query ssl"
    IIS 7/7.5: "netsh http show ssl"
    

    注意

    HttpCfg 是 Windows 支持工具的一部分,存在于安装磁盘上。

    下面是工作和非工作方案的示例:

    工作场景

    配置 Setting
    IP 0.0.0.0:443
    散 列
    Guid {00000000-0000-0000-0000-000000000000}
    CertStoreName
    CertCheckMode 0
    RevocationFreshnessTime 0
    UrlRetrievalTimeout 0
    SslCtlIdentifier 0
    SslCtlStoreName 0
    Flags 0

    非工作方案

    配置 Setting
    IP 0.0.0.0:443
    散 列 c09b416d6b 8d615db22 64079d15638e96823d
    Guid {4dc3e181-e14b-4a21-b022-59fc669b0914}
    CertStoreName
    CertCheckMode 0
    RevocationFreshnessTime 0
    UrlRetrievalTimeout 0
    SslCtlIdentifier 0
    SslCtlStoreName 0
    Flags 0

    工作方案中看到的哈希值是 SSL 证书的指纹。 请注意,在非工作方案中,GUID 全部为零。 你可能会看到哈希具有某个值或空白。 即使从网站中删除证书,然后运行 httpcfg query ssl,网站仍会将 GUID 列为所有 0。 如果看到 GUID 为“{0000...............000}”,则存在问题。

  2. 通过运行以下命令删除此条目:

    httpcfg delete ssl -i "IP:Port Number"
    

    例如:

    httpcfg delete ssl -i 0.0.0.0:443
    
  3. 若要确定是否列出了任何 IP 地址,请打开命令提示符,然后运行以下命令:

    IIS 6: httpcfg query iplisten
    
    IIS 7/7.5: netsh http show iplisten
    

    如果 IP 侦听列表为空,该命令将返回以下字符串:

    HttpQueryServiceConfiguration completed with 1168.
    

    如果命令返回 IP 地址列表,请使用以下命令删除列表中的每个 IP 地址:

    httpcfg delete iplisten -i x.x.x.x
    

    注意

    在此之后,使用 net stop http /y 命令重启 IIS。

方案 5

尽管如此,如果仍无法在 HTTPS 上浏览网站,请从客户端或服务器捕获网络跟踪。 按“SSL 或 TLS”筛选跟踪,查看 SSL 流量。

下面是非工作场景的网络跟踪快照:

显示跟踪快照的“显示筛选器”窗口的屏幕截图。

下面是工作场景的网络跟踪快照:

显示筛选器窗口的屏幕截图,其中显示了成功跟踪快照。

这是查看网络跟踪的方法。 需要展开帧详细信息,并查看服务器选择了哪些协议和密码。 从说明中选择“Server Hello”以查看这些详细信息。

在非工作方案中,客户端配置为仅使用 TLS 1.1 和 TLS 1.2。 但是,Web 服务器是 IIS 6,它可以在 TLS 1.0 之前支持,因此握手失败。

检查注册表项以确定启用或禁用了哪些协议。 路径如下:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

“Enabled”DWORD 应设置为“1”。 如果设置为 0,则禁用协议。

例如,SSL 2.0 默认处于禁用状态。

场景 6

如果所有内容都已验证,并且通过 HTTPS 访问网站时仍然遇到问题,则很可能是一些更新,这会导致 SSL 握手失败。

Microsoft 发布了 Windows 中 SSL 实现的更新:

MS12-006: Vulnerability in SSL/TLS could allow information disclosure: January 10, 2012

此更新可能会影响使用 Internet Explorer 或使用使用 Internet Explorer 执行 HTTPS 请求的应用程序的客户。

在 SSL 3.0/TLS 1.0 中,实际上进行了两项更改来解决信息泄露漏洞。 MS12-006 更新在 schannel.dll中实现一个新行为,该行为在客户端请求该行为时,在使用通用 SSL 链接块密码时发送额外的记录。 另一项更改是在 Wininet.dll(Internet Explorer (MS11-099) 的 12 月累积更新的一部分),以便 Internet Explorer 将请求新行为。

如果存在问题,则可能表现为无法连接到服务器或请求不完整。 Internet Explorer 9 及更高版本能够显示“Internet Explorer 无法显示网页”错误。 早期版本的 Internet Explorer 可能会显示空白页。

Fiddler 在捕获 HTTPS 请求并将其转发到服务器时不使用额外的记录。 因此,如果使用 Fiddler 捕获 HTTPS 流量,则请求将成功。

注册表项

MS12-006 中所述:SSL/TLS 中的漏洞可能允许信息泄露:2012 年 1 月 10 日,有一个 SendExtraRecord 注册表值,该值可以:

  • 全局禁用新的 SSL 行为,
  • 全局启用它,或
  • (默认情况下,) 为选择新行为的 SChannel 客户端启用它。

对于 Internet Explorer 和使用 Internet Explorer 组件的客户端,FeatureControl 部分FEATURE_SCH_SEND_AUX_RECORD_KB_2618444有一个注册表项,用于确定 iexplore.exe 还是任何其他命名应用程序选择新行为。 默认情况下,Internet Explorer 会启用此功能,并为其他应用程序禁用此功能。

更多信息