Chrome报告ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY通过HTTPS连接到本地Web服务器


20

摘要

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY当我尝试通过HTTPS连接到本地网络服务器时,Chrome正在报告。我几乎可以肯定,这个问题与我最近的Windows 10升级有关,但我不知道如何解决。

什么有效

这是一连串的事件,我一开始就安装了Windows 8.1 Pro:

  1. 使用以下命令生成了自签名证书,旨在用作受信任的根CA: makecert.exe -pe -ss Root -sr LocalMachine -n "CN=local, OU=development" -r -a sha512 -e 01/01/2020
  2. 从受信任的根CA生成了特定于应用程序的证书: makecert.exe -pe -ss My -sr LocalMachine -n "CN=myapp.local, OU=Development" -is Root -ir LocalMachine -in local -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -a sha512 -e 01/01/2020 -sky -eku 1.3.6.1.5.5.7.3.1
  3. 增加了一个HOSTS文件条目myapp.local它指向127.0.0.1
  4. 创建了绑定到myapp.local域的IIS 8.5应用程序,并且仅侦听HTTPS请求
  5. myapp.local证书分配给网站

使用此设置,我可以在没有任何证书或安全警告的情况下从Chrome访问我的本地网站。浏览器按预期显示了绿色的挂锁。

什么不起作用

最近,我升级到Windows10。当时我还不知道Windows 10附带了支持HTTP / 2的IIS 10。现在,当我尝试使用Chrome访问我的本地网站时,出现ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY错误。我应该注意,从Edge发送的相同请求不会导致错误,并且确实使用HTTP / 2进行连接。粗略的Google搜索并没有带来任何希望,只是暗示问题可能是HTTP / 2或Chrome对SSL证书将接受的密码严格。

考虑到Windows中启用的密码套件可能是一个问题(但不是专家),因此我下载了最新版本的IIS Crypto。我单击最佳实践按钮,单击应用,然后重新启动计算机。

IIS Crypto将这些设置报告为“最佳实践”:

  • 启用的协议:TLS 1.0,TLS 1.1,TLS 1.2
  • 启用的密码:三重DES 168,AES 128/128,AES 256/256
  • 启用的哈希值:MD5,SHA,SHA 256,SHA 384,SHA 512
  • 启用的密钥交换:Diffie-Hellman,PKCS,ECDH
  • SSL密码套件顺序:

    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P284
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P284
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P284
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256
    TLS_RSA_WITH_AES_256_GCM_SHA384
    TLS_RSA_WITH_AES_128_GCM_SHA256
    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_3DES_EDE_CBC_SHA

我还要补充一点,我正在开发浏览器应用程序并没有必须使用从Windows XP。我知道有关Windows XP的某些问题不支持较新的协议。

有关HTTPS协商的详细信息

我决定使用Fiddler来拦截HTTPS协商。这是Fiddler报告的有关请求的内容:

Version: 3.3 (TLS/1.2)
Random: 6B 47 6D 2B BC AE 00 F1 1D 41 57 7C 46 DB 35 19 D7 EF A9 2B B1 D0 81 1D 35 0D 75 7E 4C 05 14 B0
"Time": 2/1/1993 9:53:15 AM
SessionID: 98 2F 00 00 15 E7 C5 70 12 70 CD A8 D5 C7 D4 4D ED D8 1F 42 F9 A8 2C E6 67 13 AD C0 47 C1 EA 04
Extensions: 
    server_name myapp.local
    extended_master_secret  empty
    SessionTicket   empty
    signature_algs  sha512_rsa, sha512_ecdsa, sha384_rsa, sha384_ecdsa, sha256_rsa, sha256_ecdsa, sha224_rsa, sha224_ecdsa, sha1_rsa, sha1_ecdsa
    status_request  OCSP - Implicit Responder
    NextProtocolNego    empty
    SignedCertTimestamp (RFC6962)   empty
    ALPN        http/1.1, spdy/3.1, h2-14, h2
    channel_id(GoogleDraft) empty
    ec_point_formats    uncompressed [0x0]
    elliptic_curves secp256r1 [0x17], secp384r1 [0x18]
Ciphers: 
    [C02B]  TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    [C02F]  TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    [009E]  TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    [CC14]  TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
    [CC13]  TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    [CC15]  TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    [C00A]  TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
    [C014]  TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
    [0039]  TLS_DHE_RSA_WITH_AES_256_SHA
    [C009]  TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
    [C013]  TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
    [0033]  TLS_DHE_RSA_WITH_AES_128_SHA
    [009C]  TLS_RSA_WITH_AES_128_GCM_SHA256
    [0035]  TLS_RSA_AES_256_SHA
    [002F]  TLS_RSA_AES_128_SHA
    [000A]  SSL_RSA_WITH_3DES_EDE_SHA
    [00FF]  TLS_EMPTY_RENEGOTIATION_INFO_SCSV

Compression: 
    [00]    NO_COMPRESSION

和响应:

Version: 3.3 (TLS/1.2)
SessionID:  98 2F 00 00 15 E7 C5 70 12 70 CD A8 D5 C7 D4 4D ED D8 1F 42 F9 A8 2C E6 67 13 AD C0 47 C1 EA 04
Random:     55 C6 8D BF 78 72 88 41 34 BD B4 B8 DA ED D3 C6 20 5C 46 D6 5A 81 BD 6B FC 36 23 0B 15 21 5C F6
Cipher:     TLS_RSA_WITH_AES_128_GCM_SHA256 [0x009C]
CompressionSuite:   NO_COMPRESSION [0x00]
Extensions:
        ALPN        h2
        0x0017      empty
        renegotiation_info  00
        server_name empty

在做什么

基于HåkanLindqvist的答案以及此处非常详细且经过深入研究的答案,我使用以下设置重新配置了IIS Crypto,从而消除了Chrome错误:

  • 启用的协议:TLS 1.0,TLS 2.0,TLS 3.0
  • 启用的密码:AES 128/128,AES 256/256
  • 启用的哈希:SHA,SHA 256,SHA 384,SHA 512
  • 启用的密钥交换:Diffie-Hellman,PKCS,ECDH
  • SSL密码套件顺序:

    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256
    TLS_RSA_WITH_AES_256_GCM_SHA384
    TLS_RSA_WITH_AES_128_GCM_SHA256
    TLS_RSA_WITH_AES_256_CBC_SHA256
    TLS_RSA_WITH_AES_128_CBC_SHA256
    TLS_RSA_WITH_AES_256_CBC_SHA
    TLS_RSA_WITH_AES_128_C


在任何人指出显而易见的情况之前:是的,我知道makecert.exe已弃用。我仅将其用于这样的开发方案,因为它是[用于?]的最简单的选择。
NathanAldenSr 2015年

可能不是启用的密码,而是启用的ssl / tls版本。您是否启用了tls v1.0或更低版本?
Drifter104

我更新了问题,以包括我对IIS Crypto所做的操作以控制这些设置。您知道设置对于HTTP / 2和Chrome而言是否太宽松?
NathanAldenSr 2015年

stackoverflow.com/questions/31746620/…可能有所帮助。显然,在浏览器中禁用SPDY是要走的路
Drifter104

1
2.0版中的IIS加密“最佳实践”为我修复了此错误。我尝试使用您指定的套件顺序,但没有效果。显然,在此过程中,已在Windows或IIS Crypto中对其进行了修复。:)
ahwm

Answers:


21

根据https://http2.github.io/http2-spec/#rfc.section.9.2.2的 Http / 2要求:

9.2.2 TLS 1.2密码套件

通过TLS 1.2部署HTTP / 2不应使用密码套件黑名单(附录A)中列出的任何密码套件。

如果协商了黑名单中的一个密码套件,则端点可以选择生成INADEQUATE_SECURITY类型的连接错误(第5.4.1节)。选择使用列入黑名单的密码套件的部署可能会引发连接错误,除非已知一组潜在的对等方接受该密码套件。

对于未列入黑名单的密码套件的协商,实现不得产生此错误。因此,当客户端提供不在黑名单中的密码套件时,他们必须准备将密码套件与HTTP / 2一起使用。

黑名单中包括TLS 1.2强制使用的密码套件,这意味着TLS 1.2部署可能具有不相交的允许密码套件集。为避免此问题导致TLS握手失败,使用TLS 1.2的HTTP / 2部署必须支持具有P-256椭圆曲线[FIPS186]的TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE]。

请注意,客户端可能会宣传对黑名单上的密码套件的支持,以允许连接到不支持HTTP / 2的服务器。这允许服务器使用HTTP / 2黑名单上的密码套件选择HTTP / 1.1。但是,如果独立选择应用程序协议和密码套件,则可能导致与黑名单密码套件协商HTTP / 2。


您议定的密码TLS_RSA_WITH_AES_128_GCM_SHA256在上述Http / 2黑名单中。

我相信您会想要调整密码套件(订购?)以满足上述要求。也许只是将TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256NIST P-256椭圆曲线(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256在Windows上标识为)放在列表​​的顶部,或者至少放在黑名单中的任何内容之前?


我将立即尝试,让您知道结果。感谢您的详细回答!:)坦白地说,在确保浏览器能够解决不一致问题之前,似乎该密码套件问题可能会使HTTP / 2与HTTP / 1.1同时使用确实很棘手,即使不是不可能。IPv4 / IPv6,有人吗?
NathanAldenSr 2015年

我将IIS Crypto的“最佳实践”密码套件列表与黑名单进行了比较。我发现所有最佳实践TLS_RSA密码套件都在黑名单中。我禁用了它们并重新启动。但是,现在我无法使用任何浏览器建立到本地网站的安全连接。我得到ERR_CONNECTION_RESET。这与证书本身有关系吗?
NathanAldenSr 2015年

@NathanAldenSr我不认为您需要删除列入黑名单的密码(它们对于HTTP / 1.x客户端的兼容性目的可能很有用),只要非列入黑名单的密码具有更高的优先级即可。特别提到的是,所有HTTP / 2部署都必须支持(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)。
哈坎·林德奎斯特

1
谢谢您的出发点。我已经更新了答案,以显示对我有用的东西。
NathanAldenSr 2015年

1
注意,HTTP / 2规范说它是具有 P-256椭圆曲线[FIPS186] 的TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,表示字符串:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256对于Windows。
Bart Verkoeijen '16

2

这是我为暂时禁用IIS中的HTTP / 2而创建的一些PowerShell:

Set-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\HTTP\Parameters -Name EnableHttp2Tls -Value 0 -Type DWord
Set-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\HTTP\Parameters -Name EnableHttp2Cleartext -Value 0 -Type DWord

我将其作为答案,因为禁用HTTP / 2似乎是该问题的唯一“解决方案”。不过,我不会接受它,因为我真的很想在所有浏览器中可靠地在IIS 10中使用HTTP / 2。


调整密码套件(可能只是订购)以符合Http / 2规范应该可以正确解决此问题。(参见单独的答案)
哈坎·林奎斯特

3
看来您必须重新启动Windows才能使这些更改生效。只是打电话iisreset对我没有帮助。
塞巴斯蒂安·克莱斯曼斯基

-1

只需从适当的CA获得证书即可,这里有免费的证书(StartSSL),并且不需要花费更长的时间。

使用适当的证书时,在Windows 10上使用IIS 10和带有Chrome的HTTP / 2都没有问题。


1
不幸的是,这对我不起作用。我有自动脚本,可以为本地和开发环境生成这些证书,每个开发人员的工作站都需要它们。另外,我希望能够灵活地更改主机名,而不必返回第三方来获取新证书。
NathanAldenSr 2015年

@NathanAldenSr-我明白。对于完全脚本化的过程,我们使用本地内部CA。很高兴知道makecert.exe自己创建的证书是否是问题所在。我从未使用过makecert.exe,我一直认为本地CA是一种更干净的解决方案。
彼得·汉道夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.