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

适用于: Internet Information Services

概述

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

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

必须知道,每个证书都包括公钥(用于加密)和私钥(用于解密)。 私钥仅对服务器已知。

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

此疑难解答中使用的工具

用于对各种方案进行故障排除的工具包括:

  • Network Monitor 3.4
  • Wireshark

方案

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

显示消息的浏览器页面的屏幕截图,此网站的连接不安全。

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

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

方案 1

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

“证书”对话框的两个屏幕截图。一个没有私钥。另一个显示私钥对应于证书的消息。

解决方法

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

C:\>certutil - repairstore my "906c9825e56a13f1017ea40eca770df4c24cb735"

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

如果关联成功,你将看到以下窗口:

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

在此示例中, 906c9825e56a13f1017ea40eca770df4c24cb735 是证书的指纹。 若要获取指纹,请执行以下步骤:

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

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

注意

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

方案 2

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

解决方法

如果有包含私钥但无法访问网站的证书,则可能还会在系统事件日志中看到以下 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. 

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

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

  2. 如果权限已到位,并且问题仍未解决,则证书可能存在问题。 它可能已损坏。 可能会在以下 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. 
    
  3. 检查网站是否适用于测试证书。

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

  5. 尝试使用 HTTPS 访问网站。

    如果有效,则之前使用的证书已损坏,必须替换为新的工作证书。 有时,问题可能不是证书,而是证书颁发者。 在验证证书链期间,如果根 CA 证书不受信任的根证书,可能会看到错误 CERT_E_UNTRUSTEDROOT (0x800b0109)

  6. 若要修复此错误,请将 CA 的证书添加到 服务器上的“我的计算机帐户”下的“受信任的根 CA 存储”。 在验证证书链期间,可能还会收到错误 -2146762480(0x800b0110)

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

    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”对。 HTTP.sys SSL 配置必须包含证书哈希和证书存储的名称,然后 SSL 协商才能成功。 问题可能与 HTTP.SYS SSL Listener..

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

解决方法

  1. 请执行以下命令:

    netsh http show ssl
    

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

    工作场景

    配置 设置
    IP:port 0.0.0.0:443
    证书哈希 c09b416d6b 8d615db22 64079d15638e96823d
    应用程序 ID {4dc3e181-e14b-4a21-b022-59fc669b0914}
    证书存储名称 My
    验证客户端证书吊销 已启用
    吊销新鲜度时间 0
    URL 检索超时 0
    ...... ......

    非工作方案

    配置 设置
    IP:port 0.0.0.0:443
    证书哈希
    应用程序 ID {00000000-0000-0000-0000-000000000000}
    CertStoreName My
    验证客户端证书吊销 0
    吊销新鲜度时间 0
    URL 检索超时 0
    ...... ......

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

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

    netsh http delete sslcert ipport=<IP Address>:<Port>
    

    例如:

    netsh http delete sslcert ipport=0.0.0.0:443
    
  3. 若要确定是否列出了任何 IP 地址,请打开命令提示符,然后运行以下命令:

    netsh http show iplisten
    

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

    netsh http delete iplisten ipaddress=<IP Address>
    

    注意

    使用 net stop http /y 此命令重启 IIS。

方案 5

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

下面是非工作方案的网络跟踪快照:

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

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

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

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

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

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

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

启用DWORD 应设置为 1。 如果设置为 0,则会禁用协议。

例如,默认情况下禁用 SSL 2.0。

详细信息