强制使用 ECDHE 密码的 SHA256 服务器证书
SHA256 Server Certificate forcing ECDHE ciphers
我在为 IIS Web 服务器分配新的 SHA256 证书时遇到了一个奇怪的问题。
服务器启用了 SSL 3.0、TLS 1.0、1.1 和 1.2,当在使用 RSA(而不是 SHA256RSA)签名的站点上使用服务器证书时,客户端连接并协商 TLS_RSA_WITH_AES_256_CBC_SHA 以进行 TLS 加密。
第二次在站点上使用 SHA256 证书,然后它尝试使用 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA。
奇怪的是,当使用 www.ssllabs.com 服务器测试进行检查时,我可以看到无论是否使用 SHA256 证书,服务器都会提供完全不同的密码。
网站使用 SHA1 证书时显示密码套件。
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECHDE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WTH_RC4_128_MD5
站点使用 SHA256 证书时显示密码套件。
TLS_ECHDE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
我找不到任何信息来说明为什么会发生这种情况,但我知道 TLS_RSA_WITH_AES 密码与 TLS 1.2 兼容,而且似乎没有文献说明服务器证书是否为 SHA256,它强制执行椭圆曲线 Difie Helman Exchange 用于密钥加密。
谁能解释为什么会这样?
亲切的问候
詹姆斯·泰格
我现在已经设法解决了这个问题,以防其他人遇到它。
似乎与请求CSR的Cryptography/Key Store Provider有关。
如果 CSR 是在 Windows Server 2008 R2 机器上使用加密 API 提供程序(例如 Microsoft Strong Cryptographic Provider)生成的,并且在生成 CSR 时没有特别提及 KeySpec设置 KeySpec = 2 AT_SIGNATURE。 KeySpec 确定密钥是否可用于签名、密钥交换(加密)或两者。
将加密提供程序设置为加密时 API 提供程序似乎导致 Windows Server 2008 R2 计算机完成请求但默认为 KeySpec = 2 在我们的案例中,这是因为我们生成了一个 .INF 文件以与 CERTREQ 一起使用,因为 IIS 无法强制使用 SHA256 作为签名算法。
如果 .INF 文件中的 KeySpec 设置为 KeySpec = 1 AT_KEYEXCHANGE 那么这应该可行,尽管我们以不同的方式解决了这个问题。
为了解决该问题,我们更改了 .INF 文件以设置 ProviderName =“Microsoft 软件密钥存储提供程序”(CNG 提供程序)。证书完成后,它显示 KeySpec = 0 AT_NONE,这是密钥库提供程序设置为 CNG 的时候。
向 Microsoft 提出此问题是为了帮助我们更好地理解,看来我们在 KeySpec 行为和 Cryptography Provider 的使用方面是正确的。
他们确认在 .INF 文件(或 Cert MMC 中的客户模板注册)中您需要确保 KeySpec 属性 设置为 1 AT_KEYEXCHANGE 否则它将默认为 2 AT_SIGNATURE。如果您使用 CNG 提供程序,它将默认使用 0 AT_NONE 并且可以正常工作。
我希望这可以帮助其他可能遇到这个恼人问题的人,因为很难找到解决方案。
亲切的问候
詹姆斯·泰格
我在为 IIS Web 服务器分配新的 SHA256 证书时遇到了一个奇怪的问题。
服务器启用了 SSL 3.0、TLS 1.0、1.1 和 1.2,当在使用 RSA(而不是 SHA256RSA)签名的站点上使用服务器证书时,客户端连接并协商 TLS_RSA_WITH_AES_256_CBC_SHA 以进行 TLS 加密。
第二次在站点上使用 SHA256 证书,然后它尝试使用 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA。
奇怪的是,当使用 www.ssllabs.com 服务器测试进行检查时,我可以看到无论是否使用 SHA256 证书,服务器都会提供完全不同的密码。
网站使用 SHA1 证书时显示密码套件。
TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECHDE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WTH_RC4_128_MD5
站点使用 SHA256 证书时显示密码套件。
TLS_ECHDE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
我找不到任何信息来说明为什么会发生这种情况,但我知道 TLS_RSA_WITH_AES 密码与 TLS 1.2 兼容,而且似乎没有文献说明服务器证书是否为 SHA256,它强制执行椭圆曲线 Difie Helman Exchange 用于密钥加密。
谁能解释为什么会这样?
亲切的问候
詹姆斯·泰格
我现在已经设法解决了这个问题,以防其他人遇到它。
似乎与请求CSR的Cryptography/Key Store Provider有关。
如果 CSR 是在 Windows Server 2008 R2 机器上使用加密 API 提供程序(例如 Microsoft Strong Cryptographic Provider)生成的,并且在生成 CSR 时没有特别提及 KeySpec设置 KeySpec = 2 AT_SIGNATURE。 KeySpec 确定密钥是否可用于签名、密钥交换(加密)或两者。
将加密提供程序设置为加密时 API 提供程序似乎导致 Windows Server 2008 R2 计算机完成请求但默认为 KeySpec = 2 在我们的案例中,这是因为我们生成了一个 .INF 文件以与 CERTREQ 一起使用,因为 IIS 无法强制使用 SHA256 作为签名算法。
如果 .INF 文件中的 KeySpec 设置为 KeySpec = 1 AT_KEYEXCHANGE 那么这应该可行,尽管我们以不同的方式解决了这个问题。
为了解决该问题,我们更改了 .INF 文件以设置 ProviderName =“Microsoft 软件密钥存储提供程序”(CNG 提供程序)。证书完成后,它显示 KeySpec = 0 AT_NONE,这是密钥库提供程序设置为 CNG 的时候。
向 Microsoft 提出此问题是为了帮助我们更好地理解,看来我们在 KeySpec 行为和 Cryptography Provider 的使用方面是正确的。
他们确认在 .INF 文件(或 Cert MMC 中的客户模板注册)中您需要确保 KeySpec 属性 设置为 1 AT_KEYEXCHANGE 否则它将默认为 2 AT_SIGNATURE。如果您使用 CNG 提供程序,它将默认使用 0 AT_NONE 并且可以正常工作。
我希望这可以帮助其他可能遇到这个恼人问题的人,因为很难找到解决方案。
亲切的问候
詹姆斯·泰格