概要
当我尝试通过HTTPS连接到本地networking服务器时,Chrome报告了ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY 。 我几乎可以肯定,这个问题与我最近的Windows 10升级有关,但我不知道如何解决这个问题。
什么工作
这是事件的链条,我在开始时安装了Windows 8.1 Pro:
makecert.exe -pe -ss Root -sr LocalMachine -n "CN=local, OU=development" -r -a sha512 -e 01/01/2020 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 myapp.local添加了指向127.0.0.1的HOSTS文件条目 myapp.local域的IIS 8.5应用程序,并只侦听HTTPS请求 myapp.local证书分配给网站 有了这个设置,我没有任何证书或安全警告,从Chrome访问我的本地网站没有问题。 正如所料,浏览器显示绿色的挂锁。
什么都行不通
最近,我升级到了Windows 10.我当时不知道Windows 10带有支持HTTP / 2的IIS 10。 现在,当我尝试使用Chrome访问我的本地网站时,我收到一个ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY错误。 我应该注意到,从Edge发送的相同请求不会导致错误,并且使用HTTP / 2进行连接。 一个粗略的谷歌search没有什么大有前途的,除非暗示问题可能是HTTP / 2或者Chrome对SSL证书接受的密码是严格的。
考虑到在Windows中启用密码套件可能是一个问题(但不是这方面的专家),我下载了最新版本的IIS Crypto 。 我点击了最佳实践button,点击应用,然后重新启动我的机器。
IIS Crypto将这些设置报告为“最佳实践”:
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的回答,以及这里非常详细和深入研究的答案,我用以下设置重新configuration了IIS Crypto,从而消除了Chrome错误:
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_CBC_SHA
Http / 2的要求按照https://http2.github.io/http2-spec/#rfc.section.9.2.2 :
9.2.2 TLS 1.2密码套件
TLS 1.2上的HTTP / 2部署不应使用密码套件黑名单( 附录A )中列出的任何密码套件。
如果协商了黑名单中的一个密码套件,则端点可以select生成INADEQUATE_SECURITYtypes的连接错误(第5.4.1节)。 select使用黑名单密码套件的部署可能会触发连接错误,除非已知该组潜在对等方接受该密码套件。
对于不在黑名单上的密码套件的协商,实现不能产生这个错误。 因此,当客户端提供不在黑名单上的密码套件时,他们必须准备好使用带有HTTP / 2的密码套件。
黑名单包括TLS 1.2强制使用的密码套件,这意味着TLS 1.2部署可能具有不相交的允许密码套件组。 为避免导致TLS握手失败的问题,使用TLS 1.2的HTTP / 2的部署必须支持TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE]和P-256椭圆曲线[FIPS186]。
请注意,客户端可能会通告支持位于黑名单上的密码套件,以允许连接到不支持HTTP / 2的服务器。 这允许服务器使用HTTP / 2黑名单上的密码套件来selectHTTP / 1.1。 但是,如果应用程序协议和密码套件是独立select的,则可能导致HTTP / 2与黑名单密码套件进行协商。
您的谈判密码TLS_RSA_WITH_AES_128_GCM_SHA256是在上面提到的(和链接的)Http / 2黑名单。
我相信你会想调整你的密码套件(订购?),以满足上述要求。 也许简单地把TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256与NIST P-256椭圆曲线(在Windows上标识为TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256 )放在列表顶部,或者至less在黑名单中包含的任何东西之前?
下面是我创build的一些PowerShell,用于临时禁用IIS中的HTTP / 2:
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。
只需从合适的CA获得证书,就可以获得免费的证书( StartSSL ),而且不需要太长的时间才能获得证书。
当使用正确的证书时,我没有问题在Windows 10上使用IIS 10,在Chrome上使用HTTP / 2。