我目前正在为从SHA1到SHA2兼容证书pipe理的各种网站升级SSL证书。
迄今为止,我们一直使用“RSA”作为SSL证书的密钥交换机制,因此我决定在生成replace证书的证书签名请求时继续这样做。
在我的开发环境中,我已经replace了几个证书,并在Web服务器上优先考虑基于SHA256(SHA-2)的密码套件。
我注意到Google Chrome 42和Firefox 37.0.2仍在select基于SHA1的密码套件TLS_RSA_WITH_AES_256_CBC_SHA 。 (我还没有正确testingInternet Explorer)
为了确定Chrome 42和Firefox 37.0.2支持的密码套件,我已经执行了一个networking跟踪,并在ClientHellofind了TLSCipherSuites 。
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
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 }
我的networking服务器运行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
Chrome 42和Firefox 37.0.2支持的Windows Server 2008 R2上唯一提供的SHA256密码套件是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (在Server 2008 R2中_P256附有_P256 )。 但是为了支持这个套件,我必须重新发布我们的证书,把使用RSA的密钥交换机制改变为ECDSA (椭圆曲线数字签名algorithm)。 事实上,我已经尝试过这一点,它工作正常 – 但许多旧的浏览器不支持椭圆曲线密码学。 所以这不是一个可行的解决scheme。
28/04/15更新:
感谢那些为了进一步明确密钥交换algorithm和签名algorithm而作出回答的人。
我希望浏览器能够使用SHA256密码套件执行使用SHA2的消息authentication。
但问题仍然是Windows Server 2008 R2中可用的SHA256密码套件,唯一支持Chrome和Firefox的是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 。 而为了使用这个密码套件,我需要一个ECDSA签名的证书。
据我所知,椭圆曲线密码学在一些较旧的浏览器/操作系统上缺乏支持。 正如我的问题(尽pipe我的术语错误)中提到的,我确实创build了一个ECDSA签名证书,尽pipe我还没有做过广泛的testing,但迄今为止,我已经看到在Windows XP SP3上运行的IE7和IE8无法加载我的站点(通过HTTPS),并简单地产生一个“Internet Explorer无法显示网页”的消息。
当然,Windows XP现在是一个过时的操作系统,但是我担心浏览器/操作系统“旧”但仍然“支持”可能会以同样的方式失败。 因此,我有兴趣find使用RSA签名证书的解决scheme – 但这似乎是不可能的。 我对吗?
您在密码套件列表中看到的SHA256引用不适用于证书。 而是与TLS伪随机函数和消息完整性有关。
证书支持独立于TLS密码套件。
所有版本的Firefox和Chrome(以及最新版本的IE)都支持SHA256证书,如果操作系统也支持这些证书的话,那么客户端Windows版本为XP SP3以上。 Server 2008 R2具有完整的SHA256证书支持。
除了密码套件的其他部分之外,您不希望优先考虑SHA256 MACalgorithm。 这是最不重要的部分。 您今天在IIS 7.5服务器上应该拥有的优先级列表的密码套件是:
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521
要寻找的关键部分是;
您应该使用IIS Crypto( https://www.nartac.com/Products/IISCrypto/ )并select最佳做法选项。 这将给你最好的密码套件顺序,你可以在IIS中实现。
另请参阅我对这个问题的回答:
更改IIS 8中的密钥交换机制
应用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
“Richie Frame”的答案是现货。 密码套件string引用的签名内部不是SHA256。 但是除了Richie的回答之外,还有一个珍藏:
但是为了支持这个套件,我将不得不重新颁发证书,将密钥交换机制从使用“RSA”改为“ECDSA”(椭圆曲线数字签名algorithm)。
你不能这样做。 会话密钥交换机制不是在证书本身内编码的。
你正在混合密钥交换algorithm和签名algorithm。 混淆是因为RSA可以同时进行密钥交换和签名。
它大致如下所示:
对于旧的典型安装,你将有一个RSA签名的证书,你也可以通过RSA进行会话密钥交换。
对于较新的types安装,您将有一个RSA签名的证书,你会做Diffie-Hellman会话密钥交换。 然后使用证书的RSA密钥validation该匿名密钥交换。
对于今天的前沿型安装,您将拥有一个ECDSA签名证书,并且您将执行椭圆曲线 – Diffie-Hellman(ECDH)会话密钥交换。 然后使用证书的ECDSA密钥validation匿名密钥交换。
更新2015-04-29:使用sha256rsa证书
因此,我有兴趣find使用RSA签名证书的解决scheme – 但这似乎是不可能的。 我对吗?
不。 幸运的是你错了。 您可以在同一个证书中使用两者。 SHA256作为单向散列函数,RSA作为签名algorithm。 (这个特定的组合代号为“sha256WithRSAEncryption”,但还有很多其他的。)(看一下https://www.ietf.org/ ,他们现在正在使用这个确切的组合。
为了兼容,我build议你阅读IvanRistić的博客。
伊万·里斯蒂奇(IvanRistić), SHA1弃用:你需要知道的 (存档在这里 )
该博客中的一个链接是GlobalSign SHA-256兼容性表。 那对你来说可能特别有意思。
更新2015-04-29:你想用“RSA_WITH”
如果你有一个RSA证书,那么你正在使用RSAencryption。 密码套件描述符中的encryption位在“ WITH ”之前的位。
所以在你的情况下,你需要中间有“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 }
不要担心每个string末尾的“SHA”或“SHA256”。 这并不涉及证书中的内容。 它指的是相同的algorithm,但不涉及证书内的应用。