为什么Window的SSL密码套件在某些SSL证书下受到限制?

问题:在服务器上使用某些证书时,Windows Server 2008 R2将仅支持以下ssl密码套件:

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

这可以防止XP客户端连接到服务器,因为XP Cryptographic API默认不支持任何AES密码。
因此,尝试使用Internet Explorer或远程桌面进行连接时,服务器日志中会出现以下错误。 (因为他们使用微软的CAPI)

Schannel错误36874“从远程客户端应用程序收到TLS 1.0连接,但服务器支持客户端支持的密码套件的多行,SSL连接请求失败。
Schannel错误36888“生成以下致命警报:40.内部错误状态是1204”

如果在服务器上使用的证书是使用证书请求表单中的“传统密钥”选项生成的,则该证书的私钥将存储在Microsoft的传统Cryptographic API框架中。 当Web服务器尝试使用新的下一代encryption(CNG)框架处理请求时,似乎与旧框架中存储的RSA私钥相关的内容对新框架不可用。 因此,使用RSA密码套件受到严重限制。

解:
使用自定义证书申请向导中的CNG密钥模板生成证书申请。

MMC | 本地计算机证书pipe理器| 个人证书文件夹| (右键点击)| 所有任务 – >高级操作| 创build自定义请求| “继续没有注册政策”| select“(无模板)CNG键” | 请根据您的需要继续完成证书申请。

validation密钥是否在正确的位置:
http://msdn.microsoft.com/en-us/library/bb204778(VS.85).aspx
http://www.jensign.com/KeyPal/index.html

validation正确密码套件的工具:
http://pentestit.com/2010/05/16/ssltls-audit-audit-web-servers-ssl-ciphers/
https://www.ssllabs.com/

SSL密码套件设置:
http://support.microsoft.com/kb/245030
http://blogs.technet.com/b/steriley/archive/2007/11/06/changing-the-ssl-cipher-order-in-internet-explorer-7-on-windows-vista.aspx

这花了我们一个星期才弄清楚。 我希望这可以节省一些同样的麻烦。

自己也得到了这个完全相同的问题,这篇文章节省了我大量的时间,所以谢谢大家!

加里的解决scheme是现货,但我设法解决这个问题,只需将PFX转换为PEM,然后再次使用openssl返回PFX。 新的PFX在IIS中导入了证书,只是我可以看到丢失的密码。

这是如何:

openssl pkcs12 -in mycert.pfx -out mycert.cer -nodes 

然后将cer文件分为三部分,密钥,证书和中间证书[s]

 openssl pkcs12 -export -out mycert-new.pfx -inkey mycert.key \ -in mycert.crt -certfile mycert-intermediate.crt 

然后,如果您将新的.pfx文件导入到IIS中,它将使用您希望看到的所有密码。

所以不需要重新颁发证书。

谢谢,你的post对我有帮助,虽然我的问题不完全一样。

但是,原因是我的WINHTTP SERVER APIconfiguration错误。 我的IP改变了,当我把一个新的服务器证书放入机器“MY”时,我忽略了HttpSetServiceConfiguration的ALREADY_EXISTS返回码。

所以我使用了一个以前的服务器TLS证书,它具有错误的通用名称,并且与我的新服务器名称不匹配。

如果您没有正确执行HttpDeleteServiceConfiguration()或命令行“netsh http delete sslcert 0.0.0.0:8443”,则会出现以下症状的严重错误:

1)在TLS中,您的客户端Hello会立即遇到来自服务器的TCP数据包,并设置Ack和Reset标志位。 (我认为握手失败警报?)

2)事件查看器得到“以下致命警报已生成:40.内部错误状态是107。

“从远程客户端应用程序接收到SSL 3.0连接请求,但服务器不支持客户端应用程序支持的任何密码套件,SSL连接请求失败。

所以,在你去追逐一个密码套件不匹配之前,确保你真的在使用你想要使用的服务器证书:

  netsh http show sslcert 

并检查哈希值!

这可能是KeySpec = 2 – AT_SIGNATURE问题

certutil -verifystore -v我的“cert的指纹”来validationKeySpec的值。 如果是2,则需要将证书导出为PFX文件,然后运行certutil -importpfx AT_KEYEXCHANGE来修复它。