问题:在服务器上使用某些证书时,Windows Server 2008 R2 仅支持以下 SSL 密码套件:
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
这会阻止 XP 客户端连接到服务器,因为 XP 加密 API 默认不支持任何 AES 密码。
因此,当尝试使用 Internet Explorer 或远程桌面进行连接时,服务器日志中会出现以下错误。(因为它们使用微软的 CAPI)
Schannel 错误 36874“从远程客户端应用程序接收到 TLS 1.0 连接,但客户端支持的密码套件中有一些不受服务器支持。 SSL 连接请求失败。”
Schannel 错误 36888“生成了以下致命警报:40。内部错误状态为 1204”
答案1
如果服务器上使用的证书是使用证书请求表单中的旧密钥选项生成的,则该证书的私钥将存储在 Microsoft 的旧版加密 API 框架中。当 Web 服务器尝试使用其新的下一代加密 (CNG) 框架处理请求时,似乎新框架无法使用旧版框架中存储的 RSA 私钥相关内容。因此,RSA 密码套件的使用受到严重限制。
解决方案:
使用自定义证书请求向导中的 CNG 密钥模板生成证书请求。
MMC | 本地计算机证书管理器 | 个人证书文件夹 | (右键单击)| 所有任务 -> 高级操作 | 创建自定义请求 | “继续而不使用注册策略”|选择“(无模板)CNG 密钥”| 根据您的需求继续完成证书申请。
验证密钥是否在正确的位置:
http://msdn.microsoft.com/en-us/library/bb204778(VS.85).aspx
http://www.jensign.com/KeyPal/index.html
验证密码套件是否正确的工具:
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
我们花了一周时间才弄清楚。我希望这能帮助别人避免同样的麻烦。
答案2
我自己也遇到了同样的问题,这篇文章为我节省了大量时间,所以谢谢大家!
Gary 的解决方案非常准确,但我设法通过将 PFX 转换为 PEM,然后使用 openssl 再次转换为 PFX 来解决问题。新的 PFX 以同样的方式在 IIS 中导入了证书,不同之处在于我可以看到丢失的密码。
以下是具体方法:
openssl pkcs12 -in mycert.pfx -out mycert.cer -nodes
然后将 cer 文件分成三部分:密钥、证书和中间证书
openssl pkcs12 -export -out mycert-new.pfx -inkey mycert.key \
-in mycert.crt -certfile mycert-intermediate.crt
然后,如果您将新的 .pfx 文件导入 IIS,它将使用您希望看到的所有密码。
所以不需要重新颁发证书。
答案3
谢谢,你的帖子确实帮助了我,尽管我的问题并不完全相同。
但问题出在我的 WINHTTP SERVER API 配置错误上。我的 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
并检查哈希值!
答案4
这可能是 KeySpec = 2 -- AT_SIGNATURE 问题
certutil -verifystore -v 我的“证书指纹”用于验证 KeySpec 值。如果是 2,则需要将证书导出为 PFX 文件,然后运行 certutil -importpfx AT_KEYEXCHANGE 来修复它。