Sumário
O Chrome está relatando ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
quando tento me conectar ao meu servidor Web local por HTTPS. Estou quase certo de que esse problema está relacionado à minha recente atualização do Windows 10, mas não sei como corrigi-lo.
O que funcionou
Aqui está a cadeia de eventos, com o Windows 8.1 Pro instalado no início:
- Gerou um certificado autoassinado destinado a ser usado como uma CA raiz confiável usando o seguinte comando:
makecert.exe -pe -ss Root -sr LocalMachine -n "CN=local, OU=development" -r -a sha512 -e 01/01/2020
- Gerou um certificado específico do aplicativo a partir da CA raiz confiável:
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
- Foi adicionada uma
HOSTS
entrada de arquivo paramyapp.local
esses pontos em127.0.0.1
- Criou um aplicativo IIS 8.5 que está vinculado ao
myapp.local
domínio e escuta apenas solicitações HTTPS - Atribuiu o
myapp.local
certificado ao site
Com essa configuração, não tive problemas para acessar meu site local no Chrome sem nenhum certificado ou aviso de segurança. O navegador exibiu o cadeado verde, conforme o esperado.
O que não funciona
Recentemente, atualizei para o Windows 10. Não sabia no momento que o Windows 10 é fornecido com o IIS 10, que suporta HTTP / 2. Agora, quando tento acessar meus sites locais com o Chrome, recebo um ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
erro. Devo observar que a mesma solicitação enviada do Edge não resulta em erro e usa HTTP / 2 para a conexão. Uma pesquisa superficial do Google não revelou nada promissor, exceto para sugerir que o problema pode ser que o HTTP / 2 ou o Chrome seja rigoroso quanto às cifras que ele aceitará nos certificados SSL.
Pensando que pode ser um problema com os conjuntos de criptografia habilitados no Windows (mas não sendo um especialista em tais coisas), baixei a versão mais recente do IIS Crypto . Cliquei no botão Práticas recomendadas, clique em Aplicar e reiniciei minha máquina.
O IIS Crypto relata essas configurações como "práticas recomendadas":
- Protocolos ativados: TLS 1.0, TLS 1.1, TLS 1.2
- Cifras ativadas: Triple DES 168, AES 128/128, AES 256/256
- Hastes ativados: MD5, SHA, SHA 256, SHA 384, SHA 512
- Trocas de chaves ativadas: Diffie-Hellman, PKCS, ECDH
Ordem do conjunto de cifras 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
Também acrescentarei que o aplicativo do navegador que estou desenvolvendo não precisa ser utilizável no Windows XP. Sei que existem alguns problemas no Windows XP que não suportam protocolos mais recentes.
Informações detalhadas sobre a negociação HTTPS
Decidi usar o Fiddler para interceptar a negociação HTTPS. Aqui está o que o Fiddler relatou sobre a solicitação:
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
e a resposta:
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
O que está funcionando
Com base na resposta de Håkan Lindqvist e na resposta muito detalhada e aparentemente bem pesquisada aqui , reconfigurei o IIS Crypto com as seguintes configurações, o que eliminou o erro do Chrome:
- Protocolos ativados: TLS 1.0, TLS 2.0, TLS 3.0
- Cifras ativadas: AES 128/128, AES 256/256
- Hastes ativados: SHA, SHA 256, SHA 384, SHA 512
- Trocas de chaves ativadas: Diffie-Hellman, PKCS, ECDH
Ordem do conjunto de cifras 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
fonte
makecert.exe
está obsoleto. Eu o uso apenas para cenários de desenvolvimento como este, porque é a opção mais fácil que costumava funcionar.Respostas:
Requisitos Http / 2 conforme https://http2.github.io/http2-spec/#rfc.section.9.2.2 :
Sua cifra negociada
TLS_RSA_WITH_AES_128_GCM_SHA256
está na lista negra acima (e vinculada) de Http / 2.Acredito que você queira ajustar seus conjuntos de cifras (pedidos?) Para atender aos requisitos acima. Talvez simplesmente colocando
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
com aP-256
curva elíptica do NIST (identificada comoTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256
no Windows) no topo da lista, ou pelo menos antes de qualquer coisa incluída na lista negra?fonte
TLS_RSA
conjuntos de cifras de práticas recomendadas estão na lista negra. Desativei todos eles e reiniciei. No entanto, agora não consigo estabelecer uma conexão segura com o meu site local com nenhum navegador. Acabei de receberERR_CONNECTION_RESET
. Isso poderia ter algo a ver com os certificados?TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
).TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256
para Windows.Aqui estão alguns PowerShell que eu criei para desativar temporariamente o HTTP / 2 no IIS:
Estou fazendo disso uma resposta, pois desativar o HTTP / 2 parece ser a única "solução" para o problema. No entanto, não vou aceitá-lo, já que realmente gostaria de usar o HTTP / 2 no IIS 10 de maneira confiável em todos os navegadores.
fonte
iisreset
não funcionou para mim.Basta obter um certificado de uma CA apropriada, existem outros gratuitos ( StartSSL ) e não leva muito mais tempo para obtê-lo.
Ao usar um certificado adequado, não tive problemas com o IIS 10 no Windows 10 e o HTTP / 2 com o Chrome.
fonte
makecert.exe
certificados auto-criados são o problema. Eu nunca usei o makecert.exe, sempre achei que uma autoridade de certificação local é uma solução muito mais limpa.