在 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 会在重启计算机时重新生成密钥。