在 Schannel.dll 中限制特定加密算法和协议的使用

本文介绍如何在 Schannel.dll 中限制特定加密算法和协议的使用。 此信息还适用于为 Microsoft 加密 API (CAPI) 编写的独立软件供应商 (ISV) 应用程序。

适用于: Windows Server 2003
原始 KB 编号: 245030

注意

本文适用于 Windows Server 2003 和早期版本的 Windows。 有关适用于 Windows Server 2008 及更高版本 Windows 的注册表项,请参阅 TLS 注册表设置

摘要

Windows NT 4.0 Service Pack 6 中包含的以下加密服务提供程序 (CSP) 获得了 FIPS-140-1 加密验证的证书。

  • Microsoft Base Cryptographic Provider (Rsabase.dll)
  • Microsoft Enhanced Cryptographic Provider (Rsaenh.dll)(非导出版本)

Microsoft TLS/SSL 安全提供程序(Schannel.dll 文件)使用此处列出的 CSP 通过 SSL 或 TLS 进行安全通信,以支持 Internet Explorer 和 Internet Information Services (IIS)。

你可以更改 Schannel.dll 文件以支持密码套件 1 和 2。 但是,该程序还必须支持密码套件 1 和 2。 IIS 4.0 和 5.0 不支持密码套件 1 和 2。

本文包含为 Windows NT 4.0 Service Pack 6 及更高版本配置 TLS/SSL 安全提供程序所需的信息。 可以使用 Windows 注册表来控制对 Base Cryptographic Provider 或 Enhanced Cryptographic Provider 支持的加密算法的特定 SSL 3.0 或 TLS 1.0 密码套件使用。

注意

在 Windows NT 4.0 Service Pack 6 中,Schannel.dll 文件不使用 Microsoft Base DSS Cryptographic Provider (Dssbase.dll) 或 Microsoft DS/Diffie-Hellman Enhanced Cryptographic Provider (Dssenh.dll)。

密码套件

SSL 3.0 和 TLS 1.0 (RFC2246) (INTERNET-DRAFT 56-bit Export Cipher Suites For TLS draft-ietf-tls-56-bit-ciphersuites-00.txt) 提供使用不同密码套件的选项。 每个密码套件确定 SSL/TLS 会话中使用的密钥交换、身份验证、加密和 MAC 算法。 在将 RSA 用作密钥交换和身份验证算法时,术语“RSA”在相应的密码套件定义中只出现一次。

在使用 Base Cryptographic Provider 或 Enhanced Cryptographic Provider 时,Windows NT 4.0 Service Pack 6 Microsoft TLS/SSL 安全提供程序支持以下 SSL 3.0 定义的密码套件:

SSL 3.0 密码套件
SSL_RSA_EXPORT_WITH_RC4_40_MD5 { 0x00,0x03 }
SSL_RSA_WITH_RC4_128_MD5 { 0x00,0x04 }
SSL_RSA_WITH_RC4_128_SHA { 0x00,0x05 }
SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 { 0x00,0x06 }
SSL_RSA_WITH_DES_CBC_SHA { 0x00,0x09 }
SSL_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }
SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA { 0x00,0x62 }
SSL_RSA_EXPORT1024_WITH_RC4_56_SHA { 0x00,0x64 }

注意

SSL 3.0 文本中既未定义 SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA,也未定义 SSL_RSA_EXPORT1024_WITH_RC4_56_SHA。 但是,一些 SSL 3.0 供应商支持它们。 这包括 Microsoft。

在使用 Base Cryptographic Provider 或 Enhanced Cryptographic Provider 时,Windows NT 4.0 Service Pack 6 Microsoft TLS/SSL 安全提供程序也支持以下 TLS 1.0 定义的密码套件:

TLS 1.0 密码套件
TLS_RSA_EXPORT_WITH_RC4_40_MD5 { 0x00,0x03 }
TLS_RSA_WITH_RC4_128_MD5 { 0x00,0x04 }
TLS_RSA_WITH_RC4_128_SHA { 0x00,0x05 }
TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 { 0x00,0x06 }
TLS_RSA_WITH_DES_CBC_SHA { 0x00,0x09 }
TLS_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }
TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA { 0x00,0x62 }
TLS_RSA_EXPORT1024_WITH_RC4_56_SHA { 0x00,0x64 }

注意

使用第一字节 0x00 定义的密码套件是非专用的,用于进行开放互操作通信。 因此,Windows NT 4.0 Service Pack 6 Microsoft TLS/SSL 安全提供程序遵循在 SSL 3.0 和 TLS 1.0 中指定的使用这些密码套件的过程以确保互操作性。

特定于 Schannel 的注册表项

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的详细信息,请参阅如何备份和还原 Windows 中的注册表

注意

对“CIPHERS”项或“HASHES”项的任何内容更改都将立即生效,无需重启系统。

SCHANNEL 项

启动注册表编辑器 (Regedt32.exe),并找到以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

SCHANNEL\Protocols 子项

要使系统使用默认情况下不会协商的协议(如 TLS 1.1 和 TLS 1.2),请在“Protocols”项下的以下注册表项中将“DisabledByDefault”值的 DWORD 值数据改为“0x0”

  • SCHANNEL\Protocols\TLS 1.1\Client
  • SCHANNEL\Protocols\TLS 1.1\Server
  • SCHANNEL\Protocols\TLS 1.2\Client
  • SCHANNEL\Protocols\TLS 1.2\Server

警告

“Protocols”项下的注册表项中的“DisabledByDefault”值不优先于在包含 Schannel 凭据数据的 SCHANNEL_CRED 结构中定义的“grbitEnabledProtocols”值。

SCHANNEL\Ciphers 子项

“SCHANNEL”项下“密码”注册表项用于控制对称算法(如 DES 和 RC4)的使用。 下面是“密码”项下的有效注册表项。

采用以下格式创建 SCHANNEL“密码”子项: SCHANNEL\(VALUE)\(VALUE/VALUE)

RC4 128/128

“密码”子项: SCHANNEL\Ciphers\RC4 128/128

此子项涉及 128 位 RC4。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 或者,将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。 此注册表项不适用于没有 SGC 证书的可导出服务器。

禁用此算法实际上禁止了以下值:

  • SSL_RSA_WITH_RC4_128_MD5
  • SSL_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_RC4_128_MD5
  • TLS_RSA_WITH_RC4_128_SHA

三重 DES 168

“密码”子项: SCHANNEL\Ciphers\Triple DES 168

此注册表项涉及 ANSI X9.52 和 Draft FIPS 46-3 中指定的 168 位三重 DES。 此注册表项不适用于导出版本。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 或者,将 DWORD 数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

禁用此算法实际上禁止了以下值:

  • SSL_RSA_WITH_3DES_EDE_CBC_SHA

  • SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA

  • TLS_RSA_WITH_3DES_EDE_CBC_SHA

  • TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA

    注意

    对于在 Windows Vista 之前发布的 Windows 版本,项应为“三重 DES 168/168”

RC2 128/128

“密码”子项: SCHANNEL\Ciphers\RC2 128/128

此注册表项涉及 128 位 RC2。 它不适用于导出版本。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

RC4 64/128

“密码”子项: SCHANNEL\Ciphers\RC4 64/128

此注册表项涉及 64 位 RC4。 它不适用于导出版本(但在 Microsoft Money 中使用)。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

RC4 56/128

“密码”子项: SCHANNEL\Ciphers\RC4 56/128

此注册表项涉及 56 位 RC4。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

禁用此算法实际上禁止了以下值:

  • TLS_RSA_EXPORT1024_WITH_RC4_56_SHA

RC2 56/128

“密码”子项: SCHANNEL\Ciphers\RC2 56/128

此注册表项涉及 56 位 RC2。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

DES 56

“密码”子项: SCHANNEL\Ciphers\DES 56/56

此注册表项涉及 FIPS 46-2 中指定的 56 位 DES。 其在 Rsabase.dll 和 Rsaenh.dll 文件中的实现在 FIPS 140-1 加密模块验证计划下进行验证。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

禁用此算法实际上禁止了以下值:

  • SSL_RSA_WITH_DES_CBC_SHA
  • TLS_RSA_WITH_DES_CBC_SHA

RC4 40/128

“密码”子项: SCHANNEL\Ciphers\RC4 40/128

此注册表项涉及 40 位 RC4。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

禁用此算法实际上禁止了以下值:

  • SSL_RSA_EXPORT_WITH_RC4_40_MD5
  • TLS_RSA_EXPORT_WITH_RC4_40_MD5

RC2 40/128

“密码”子项: SCHANNEL\Ciphers\RC2 40/128

此注册表项涉及 40 位 RC2。

要允许此密码算法,请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”。 如果未配置“启用”值,则会启用默认值。

禁用此算法实际上禁止了以下值:

  • SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
  • TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5

NULL

“密码”子项: SCHANNEL\Ciphers\NULL

此注册表项表示不加密。 默认情况下,其处于关闭状态。

要关闭加密(禁止所有密码算法),请将“启用”值的 DWORD 值数据更改为“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”

哈希

“密码”子项: SCHANNEL/Hashes

“SCHANNEL”项下的“哈希”注册表项用于控制哈希算法(如 SHA-1 和 MD5)的使用。 以下是“哈希”项下的有效注册表项。

MD5

“密码”子项: SCHANNEL\Hashes\MD5

要允许此哈希算法,请将“启用”值的 DWORD 值数据更改为默认值“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”

禁用此算法实际上禁止了以下值:

  • SSL_RSA_EXPORT_WITH_RC4_40_MD5
  • SSL_RSA_WITH_RC4_128_MD5
  • SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
  • TLS_RSA_EXPORT_WITH_RC4_40_MD5
  • TLS_RSA_WITH_RC4_128_MD5
  • TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5

SHA

“密码”子项: SCHANNEL\Hashes\SHA

此注册表项涉及 FIPS 180-1 中指定的安全哈希算法 (SHA-1)。 其在 Rsabase.dll 和 Rsaenh.dll 文件中的实现在 FIPS 140-1 加密模块验证计划下进行验证。

要允许此哈希算法,请将“启用”值的 DWORD 值数据更改为默认值“0xffffffff”。 否则,请将 DWORD 值数据更改为“0x0”

禁用此算法实际上禁止了以下值:

  • SSL_RSA_WITH_RC4_128_SHA
  • SSL_RSA_WITH_DES_CBC_SHA
  • SSL_RSA_WITH_3DES_EDE_CBC_SHA
  • SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA
  • SSL_RSA_EXPORT1024_WITH_RC4_56_SHA
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_DES_CBC_SHA
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA
  • TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA
  • TLS_RSA_EXPORT1024_WITH_RC4_56_SHA

KeyExchangeAlgorithms

“密码”子项: SCHANNEL/KeyExchangeAlgorithms

“SCHANNEL”项下的“KeyExchangeAlgorithms”注册表项用于控制密钥交换算法(如 RSA)的使用。 以下是“KeyExchangeAlgorithms”项下的有效注册表项。

PKCS

“密码”子项: SCHANNEL\KeyExchangeAlgorithms\PKCS

此注册表项涉及 RSA(密钥交换和身份验证算法)。

要允许 RSA,请将“启用”值的 DWORD 值数据更改为默认值“0xffffffff”。 否则,请将 DWORD 数据更改为“0x0”

禁用 RSA 实际上禁止了 Windows NT4 SP6 Microsoft TLS/SSL 安全提供程序支持的所有基于 RSA 的 SSL 和 TLS 密码套件。

FIPS 140-1 密码套件

你可能只需使用与 Microsoft Base/Enhanced Cryptographic Provider 提供的 FIPS 46-3 或 FIPS 46-2 和 FIPS 180-1 算法相对应的 SSL 3.0 或 TLS 1.0 密码套件。

本文将它们称为 FIPS 140-1 密码套件。 具体而言,它们如下所示:

  • SSL_RSA_WITH_DES_CBC_SHA
  • SSL_RSA_WITH_3DES_EDE_CBC_SHA
  • SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA
  • TLS_RSA_WITH_DES_CBC_SHA
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA
  • TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA

要仅使用此处定义并受 Windows NT 4.0 Service Pack 6 Microsoft TLS/SSL 安全提供程序通过 Base Cryptographic Provider 或 Enhanced Cryptographic Provider 支持的 FIPS 140-1 密码套件,请将以下注册表项中的“启用”值的 DWORD 值数据配置为“0x0”

  • SCHANNEL\Ciphers\RC4 128/128
  • SCHANNEL\Ciphers\RC2 128/128
  • SCHANNEL\Ciphers\RC4 64/128
  • SCHANNEL\Ciphers\RC4 56/128
  • SCHANNEL\Ciphers\RC2 56/128
  • SCHANNEL\Ciphers\RC4 40/128
  • SCHANNEL\Ciphers\RC2 40/128
  • SCHANNEL\Ciphers\NULL
  • SCHANNEL\Hashes\MD5

并将以下注册表项中的“启用”值的 DWORD 值数据配置为“0xffffffff”

  • SCHANNEL\Ciphers\DES 56/56
  • SCHANNEL\Ciphers\Triple DES 168/168(不适用于导出版本)
  • SCHANNEL\Hashes\SHA
  • SCHANNEL\KeyExchangeAlgorithms\PKCS

使用 FIPS 140-1 密码套件进行主密钥计算

在 SSL 3.0 中使用 FIPS 140-1 密码套件的过程不同于在 TLS 1.0 中使用 FIPS 140-1 密码套件的过程。

在 SSL 3.0 中,以下是定义 master_secret 计算:

在 TLS 1.0 中,以下是定义 master_secret 计算:

其中:

选择在 TLS 1.0 中仅使用 FIPS 140-1 密码套件的选项:

由于这种差异,客户可能希望禁止使用 SSL 3.0,即使允许的密码套件集仅限于 FIPS 140-1 密码套件的子集也是如此。 在这种情况下,请在“协议”项下的以下注册表项中将“启用”值的 DWORD 值数据更改为“0x0”:

  • SCHANNEL\Protocols\SSL 3.0\Client
  • SCHANNEL\Protocols\SSL 3.0\Server

警告

“协议”项下的这些注册表项中的“启用”值数据优先于包含 Schannel 凭据数据的 SCHANNEL_CRED 结构中定义的“grbitEnabledProtocols”值。 默认“启用”值数据为“0xffffffff”

注册表文件示例

本文的本部分提供了用于配置的注册表文件内容的两个示例。 它们是 Export.reg 和 Non-export.reg。

在运行 Windows NT 4.0 Service Pack 6 且具有可导出的 Rasbase.dll 和 Schannel.dll 文件的计算机中,运行 Export.reg 以确保计算机仅使用 TLS 1.0 FIPS 密码套件。

在运行 Windows NT 4.0 Service Pack 6 且包括不可导出的 Rasenh.dll 和 Schannel.dll 文件的计算机中,运行 Non-export.reg 以确保计算机仅使用 TLS 1.0 FIPS 密码套件。

要使 Schannel.dll 文件识别“SCHANNEL”注册表项下的任何更改,必须重启计算机。

要将注册表设置改回默认值,请删除“SCHANNEL”注册表项及其下的所有内容。 如果这些注册表项不存在,Schannel.dll 会在重启计算机时重新生成密钥。