AD FS 和证书 KeySpec 属性信息

密钥规范(“KeySpec”)是与证书和密钥关联的属性。 它指定与证书关联的私钥是否可用于签名和/或加密。

不正确的 KeySpec 值会导致 AD FS 和 Web 应用程序代理错误,例如:

  • 无法与 AD FS 或 Web 应用程序代理建立 SSL/TLS 连接,且未记录 AD FS 事件(但可能记录了 SChannel 36888 和 36874 事件)
  • 无法在基于 AD FS 或 WAP 表单的身份验证页面上登录,页面上未显示错误消息。

你可能会在事件日志中看到以下事件:

Log Name:   AD FS Tracing/Debug
Source: AD FS Tracing
Date:   2/12/2015 9:03:08 AM
Event ID:   67
Task Category: None
Level:  Error
Keywords:   ADFSProtocol
User:   S-1-5-21-3723329422-3858836549-556620232-1580884
Computer:   ADFS1.contoso.com
Description:
Ignore corrupted SSO cookie.

导致问题的原因

KeySpec 属性标识如何使用通过 Microsoft CryptoAPI (CAPI) 从 Microsoft 旧版加密存储提供程序 (CSP) 生成或检索的密钥。

KeySpec 值为 1 或 AT_KEYEXCHANGE 时,可用于签名和加密。 该值为 2 或 AT_SIGNATURE 时,仅用于签名。

最常见的 KeySpec 错误配置是将值 2 用于令牌签名证书以外的证书。

对于使用下一代加密 (CNG) 提供程序生成的密钥的证书,没有密钥规范的概念,KeySpec 值始终为零。

在本文的下一节中了解如何检查有效的 KeySpec 值。

示例

旧版 CSP 的一个示例是 Microsoft 增强加密提供程序。

Microsoft RSA CSP 密钥 blob 格式包括一个算法标识符,分别为 CALG_RSA_KEYX 或 CALG_RSA_SIGN,用于服务对 AT_KEYEXCHANGE 或 AT_SIGNATURE 密钥的请求。

RSA 密钥算法标识符映射到 KeySpec 值,如下所示

提供程序支持的算法 CAPI 调用的密钥规范值
CALG_RSA_KEYX:可用于签名和解密的 RSA 密钥 AT_KEYEXCHANGE(或 KeySpec=1
CALG_RSA_SIGN:RSA 仅签名密钥 AT_SIGNATURE(或 KeySpec=2

KeySpec 值和相关含义

以下是各 KeySpec 值的含义:

Keyspec 值 含义 建议的 AD FS 用途
0 证书为 CNG 证书 仅 SSL 证书
1 对于旧版 CAPI(非 CNG)证书,密钥可用于签名和解密 SSL、令牌签名、令牌解密、服务通信证书
2 对于旧版 CAPI(非 CNG)证书,密钥只能用于签名 不建议

如何查看证书/密钥的 KeySpec 值

若要查看证书的值,可以使用 certutil 命令行工具。

示例如下:certutil –v –store my。 此命令会将证书信息转储到屏幕。

Keyspec cert

在 CERT_KEY_PROV_INFO_PROP_ID 下查找两项内容:

  • ProviderType:表示证书是使用旧版加密存储提供程序 (CSP) 还是使用基于更新的下一代证书 (CNG) API 的密钥存储提供程序。 任何非零值都表示使用旧版提供程序。

  • KeySpec:下表显示了 AD FS 证书的有效 KeySpec 值:

    旧版 CSP 提供程序(ProviderType 不等于 0):

    AD FS 证书用途 有效的 KeySpec 值
    服务通信 1
    令牌解密 1
    令牌签名 1 和 2
    SSL 1

    CNG 提供程序 (ProviderType = 0):

    AD FS 证书用途 有效的 KeySpec 值
    SSL 0

如何将证书的 keyspec 更改为受支持的值

更改 KeySpec 值不需要重新生成或重新颁发证书。 可以通过将完整的证书和私钥从 PFX 文件重新导入证书存储来更改 KeySpec,操作步骤如下。

  1. 检查并记录现有证书的私钥权限,以便在重新导入后根据需要重新配置。
  2. 将包含私钥的证书导出到 PFX 文件。
  3. 对每个 AD FS 和 WAP 服务器执行以下步骤。
    1. 删除证书(从 AD FS/WAP 服务器)。
    2. 打开权限提升的 PowerShell 命令提示符。
    3. 使用以下语法在每个 AD FS 和 WAP 服务器上导入 PFX 文件,并指定 AT_KEYEXCHANGE 值(适用于所有 AD FS 证书用途):
      1. certutil –importpfx certfile.pfx AT_KEYEXCHANGE
      2. 输入 PFX 密码。
    4. 完成上述过程后,执行以下操作:
      1. 检查私钥权限。
      2. 重启 AD FS 或 WAP 服务。