Windows Server 2008 R2 - 基于 SHA2 的密码套件

Windows Server 2008 R2 - 基于 SHA2 的密码套件

我目前正在将我管理的各个网站的 SSL 证书从 SHA1 升级为兼容 SHA2 的证书。

到目前为止,我们一直使用“RSA”作为 SSL 证书上的密钥交换机制,因此我决定在生成替换证书的证书签名请求时继续这样做。

在我的开发环境中,我已经替换了多个证书,并在 Web 服务器上优先考虑基于 SHA256(SHA-2)的密码套件。

我注意到 Google Chrome 42 和 Firefox 37.0.2 仍在选择基于 SHA1 的密码套件TLS_RSA_WITH_AES_256_CBC_SHA。(我尚未对 Internet Explorer 进行适当测试)

为了确定 Chrome 42 和 Firefox 37.0.2 支持哪些密码套件,我执行了网络跟踪并找到了其中TLSCipherSuitesClientHello

Chrome 42:

TLSCipherSuites: Unknown Cipher
TLSCipherSuites: Unknown Cipher
TLSCipherSuites: Unknown Cipher
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2B }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2F }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 { 0x00, 0x9E }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA { 0xC0,0x0A }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA { 0xC0,0x14 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x39 }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA { 0xC0,0x09 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA { 0xC0,0x13 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x33 }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_RC4_128_SHA { 0xC0,0x07 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_RC4_128_SHA { 0xC0,0x11 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_GCM_SHA256 { 0x00, 0x9C }
TLSCipherSuites: TLS_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x35 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x2F }
TLSCipherSuites: TLS_RSA_WITH_RC4_128_SHA { 0x00,0x05 }
TLSCipherSuites: TLS_RSA_WITH_RC4_128_MD5 { 0x00,0x04 }
TLSCipherSuites: TLS_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }
TLSCipherSuites: Unknown Cipher

Firefox 37.0.2:

TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2B }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2F }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA { 0xC0,0x0A }
TLSCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA { 0xC0,0x09 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA { 0xC0,0x13 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA { 0xC0,0x14 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x33 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x39 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x2F }
TLSCipherSuites: TLS_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x35 }
TLSCipherSuites: TLS_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }

网络服务器

我的网络服务器运行的是 Windows Server 2008 R2,并支持以下密码套件(注意 - 这是默认的优先顺序,我已经优先考虑所有基于 SHA256 的套件):

TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_MD5,SSL_CK_RC4_128_WITH_MD5,
SSL_CK_DES_192_EDE3_CBC_WITH_MD5,TLS_RSA_WITH_NULL_SHA256,TLS_RSA_WITH_NULL_SHA

Windows Server 2008 R2 上唯一受 Chrome 42 和 Firefox 37.0.2 支持的 SHA256 密码套件是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(在 Server 2008 R2 中已将其_P256附加到名称中)。但为了支持此套件,我必须重新颁发我们的证书,将密钥交换机制从使用更改RSAECDSA(椭圆曲线数字签名算法)。事实上,我已经尝试过这种方法,效果很好 - 但许多旧版浏览器不支持椭圆曲线加密。所以这不是一个可行的解决方案。

  • 那么,有没有一种方法可以让 Firefox 和 Chrome 在 Windows Server 2008 R2 Web 服务器上选择 SHA256 密码套件,同时又不会破坏与旧浏览器的兼容性?
  • 是否可以向操作系统添加额外的密码套件?


2015年4月28日更新:
感谢那些回答者对密钥交换算法和签名算法做出的更清晰的解释。

我希望浏览器能够使用 SHA256 密码套件并使用 SHA2 执行消息认证。

但问题在于,在 Windows Server 2008 R2 中可用的 SHA256 密码套件中,唯一同时支持 Chrome 和 Firefox 的是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256。为了使用这个密码套件,我需要一个 ECDSA 签名的证书。

据我所知,椭圆曲线加密法在某些旧版浏览器/操作系统上缺乏支持。正如我的问题中提到的(虽然我用错了术语),我确实创建了一个 ECDSA 签名的证书,虽然我没有进行广泛的测试,但到目前为止,我发现在 Windows XP SP3 上运行的 IE7 和 IE8 无法加载我的网站(通过 HTTPS),只会显示“Internet Explorer 无法显示网页”消息。

当然,Windows XP 现在已经过时了,但我担心“旧”但仍“受支持”的浏览器/操作系统可能会以同样的方式失败。因此,我有兴趣找到使用 RSA 签名证书的解决方案 - 但这似乎是不可能的。我说得对吗?

答案1

您在密码套件列表中看到的 SHA256 参考不适用于证书。相反,它们与 TLS 伪随机函数和消息完整性有关。

证书支持独立于 TLS 密码套件。

如果操作系统支持 SHA256 证书,则所有版本的 Firefox 和 Chrome(以及最新版本的 IE)都支持 SHA256 证书,对于客户端 Windows 而言,操作系统为 XP SP3 及更高版本。Server 2008 R2 完全支持 SHA256 证书。

答案2

您不会希望将 SHA256 MAC 算法的优先级置于密码套件的其他部分之上。它是最不重要的部分。您目前在 IIS 7.5 服务器上的优先级列表中应排在首位的密码套件是:

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521

要寻找的关键部分是;

  • 密钥交换密码(ECDHE 最好,椭圆曲线速度快,Ephemeral Diffie-Hellman 前向保密性好)
  • RSA 作为证书签名算法——正如您所发现的,较新的 ECDSA 证书与较旧的客户端存在兼容性问题
  • 对称密码。AES GCM 128 位是最好的,但目前您无法在 Windows 中同时拥有它和 ECDHE/RSA。其次是 AES CBC(128 位或 256 位)。

您应该使用 IIS Crypto(https://www.nartac.com/Products/IISCrypto/) 并选择最佳实践选项。这将为您提供目前在 IIS 中可以实现的最佳密码套件排序。

另请参阅我对这个问题的回答:

更改 IIS 8 中的密钥交换机制

应用 IIS Crypto 最佳实践后,Windows Server 2008 R2 启用了密码:

应用 IIS Crypto 最佳实践后,Windows Server 2008 R2 启用了密码

为了获取服务器端列表,我通常使用此处“列出支持的密码套件”下提供的代码的编译版本;

https://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx

如果您想使用,我已经将我编译的版本上传到 Dropbox(风险自负,我不承担任何责任。但它是安全的!)

https://www.dropbox.com/s/mvajmebtyilgics/listciphers.exe?dl=0

答案3

“Richie Frame” 的回答非常正确。密码套件字符串指的不是签名中的 SHA256。但除了 Richie 的回答之外,这里还有一个额外的小知识:

但是为了支持这个套件,我必须重新颁发我们的证书,将密钥交换机制从使用“RSA”更改为“ECDSA”(椭圆曲线数字签名算法)。

你不能这样做。会话密钥交换机制是不是在证书本身内部进行编码。

您混淆了密钥交换算法和签名算法。造成混淆的原因是 RSA 既可以进行密钥交换,又可以进行签名。

大致可以分解如下:

  • 对于旧的典型安装,您将拥有一个 RSA 签名的证书,并且您也可以通过 RSA 进行会话密钥交换。

  • 对于较新类型的安装,您将拥有一个 RSA 签名证书,并进行 Diffie-Hellman 会话密钥交换。然后使用证书的 RSA 密钥验证该匿名密钥交换。

  • 对于当今最先进的安装类型,您将拥有一个 ECDSA 签名的证书,并进行椭圆曲线 Diffie-Hellman (ECDH) 会话密钥交换。然后使用证书的 ECDSA 密钥验证该匿名密钥交换。

更新 2015-04-29:使用 sha256rsa 证书

因此,我有兴趣找到使用 RSA 签名证书的解决方案 - 但这似乎是不可能的。我对此的看法正确吗?

不。幸好你错了。你可以在同一个证书中使用两者。SHA256 作为单向哈希函数,RSA 作为签名算法。(这个特定的组合代号为“sha256WithRSAEncryption”。但还有很多其他的。)(请查看https://www.ietf.org/。他们现在就使用这个确切的组合。)

为了兼容性,我建议您阅读 Ivan Ristić 的博客。

伊凡·里斯蒂克,SHA1 弃用:你需要知道什么 (存档这里

该博客中的一个链接是 GlobalSign SHA-256 兼容性表。您可能对此特别感兴趣。

更新 2015-04-29:你想要一些带有“RSA_WITH”的东西
如果您有 RSA 证书,则您正在使用 RSA 加密。密码套件描述符字符串中的加密位是““。

因此,在您的情况下,您需要中间带有“RSA_WITH”的东西。我从您上面制作的 Firefox 列表中获取了这些:

TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 { 0xC0,0x2F }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA { 0xC0,0x13 }
TLSCipherSuites: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA { 0xC0,0x14 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x33 }
TLSCipherSuites: TLS_DHE_RSA_WITH_AES_256_CBC_SHA { 0x00, 0x39 }
TLSCipherSuites: TLS_RSA_WITH_AES_128_CBC_SHA { 0x00, 0x2F }

不用担心每个字符串末尾的“SHA”或“SHA256”。这确实不是请参阅证书中的内容。它指的是相同的算法,但不是指证书内部的应用。

相关内容