O Chrome reporta ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY conectando-se ao servidor da Web local por HTTPS

20

Sumário

O Chrome está relatando ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYquando 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:

  1. 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
  2. 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
  3. Foi adicionada uma HOSTSentrada de arquivo para myapp.localesses pontos em127.0.0.1
  4. Criou um aplicativo IIS 8.5 que está vinculado ao myapp.localdomínio e escuta apenas solicitações HTTPS
  5. Atribuiu o myapp.localcertificado 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_SECURITYerro. 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

NathanAldenSr
fonte
Antes que alguém aponte o óbvio: Sim, estou ciente de que makecert.exeestá obsoleto. Eu o uso apenas para cenários de desenvolvimento como este, porque é a opção mais fácil que costumava funcionar.
precisa saber é o seguinte
Talvez não a cifra, mas a versão ssl / tls ativada. Você tem o tls v1.0 ou inferior ativado?
precisa saber é o seguinte
Atualizei a pergunta para incluir o que fiz com o IIS Crypto para controlar essas configurações. Você sabe se as configurações são permissivas demais para HTTP / 2 e Chrome?
NathanAldenSr
stackoverflow.com/questions/31746620/… pode ajudar. Aparentemente incapacitante spdy no navegador é o caminho a percorrer
Drifter104
1
As "Melhores Práticas" do IIS Crypto na versão 2.0 corrigiram esse erro para mim. Tentei usar a ordem do conjunto que você especificou, mas não teve efeito. Aparentemente, foi corrigido no Windows ou no IIS Crypto em algum lugar ao longo do caminho. :)
ahwm

Respostas:

21

Requisitos Http / 2 conforme https://http2.github.io/http2-spec/#rfc.section.9.2.2 :

9.2.2 Conjuntos de cifras TLS 1.2

Uma implantação de HTTP / 2 sobre TLS 1.2 NÃO DEVE usar nenhum dos conjuntos de cifras listados na lista negra de conjuntos de cifras ( Apêndice A ).

Pontos finais podem optar por gerar um erro de conexão (Seção 5.4.1) do tipo INADEQUATE_SECURITY se um dos conjuntos de cifras da lista negra for negociado. Uma implantação que opte por usar um conjunto de cifras na lista negra corre o risco de desencadear um erro de conexão, a menos que se saiba que o conjunto de possíveis pares aceita esse conjunto de cifras.

Implementações não devem gerar esse erro em reação à negociação de um conjunto de cifras que não está na lista negra. Consequentemente, quando os clientes oferecem um conjunto de códigos que não está na lista negra, eles precisam estar preparados para usar esse conjunto de códigos com HTTP / 2.

A lista negra inclui o conjunto de cifras que o TLS 1.2 torna obrigatório, o que significa que as implantações do TLS 1.2 podem ter conjuntos sem interseção de conjuntos de cifras permitidos. Para evitar esse problema que causa falhas no handshake do TLS, as implantações do HTTP / 2 que usam o TLS 1.2 DEVEM suportar TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE] com a curva elíptica P-256 [FIPS186].

Observe que os clientes podem anunciar o suporte de conjuntos de cifras que estão na lista negra para permitir a conexão com servidores que não suportam HTTP / 2. Isso permite que os servidores selecionem HTTP / 1.1 com um conjunto de cifras que esteja na lista negra de HTTP / 2. No entanto, isso pode resultar na negociação do HTTP / 2 com um conjunto de códigos listado na lista negra, se o protocolo do aplicativo e o conjunto de códigos forem selecionados independentemente.


Sua cifra negociada TLS_RSA_WITH_AES_128_GCM_SHA256está 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_SHA256com a P-256curva elíptica do NIST (identificada como TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256no Windows) no topo da lista, ou pelo menos antes de qualquer coisa incluída na lista negra?

Håkan Lindqvist
fonte
Vou tentar isso imediatamente e informar como fica. Obrigado pela resposta detalhada! :) Honestamente, parece que esse problema do conjunto de cifras pode tornar o uso do HTTP / 2 ao mesmo tempo que o HTTP / 1.1 realmente complicado, se não impossível, até que os navegadores tenham a garantia de solucionar as inconsistências. IPv4 / IPv6, alguém?
NathanAldenSr
Comparei a lista de conjuntos de cifras das "melhores práticas" do IIS Crypto com a lista negra. O que descobri é que todos os TLS_RSAconjuntos 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 receber ERR_CONNECTION_RESET. Isso poderia ter algo a ver com os certificados?
NathanAldenSr
@NathanAldenSr Eu não acho que você precise remover as cifras da lista negra (elas podem ser úteis para fins de compatibilidade para clientes HTTP / 1.x), desde que as cifras não incluídas na lista negra tenham maior prioridade. Em particular, o mencionado que todas as implantações HTTP / 2 DEVEM suportar ( TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256).
Håkan Lindqvist
1
Obrigado pelo ponto de partida. Atualizei minha resposta para mostrar o que funcionou para mim.
NathanAldenSr
1
Observe que a especificação HTTP / 2 diz que é TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 com a curva elíptica P-256 [FIPS186], significando a sequência: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256para Windows.
Bart Verkoeijen
2

Aqui estão alguns PowerShell que eu criei para desativar temporariamente o HTTP / 2 no IIS:

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

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.

NathanAldenSr
fonte
Ajustar os conjuntos de cifras (possivelmente apenas o pedido) para atender às especificações Http / 2 deve resolver o problema corretamente. (Veja resposta em separado)
Håkan Lindqvist
3
Parece que você precisa reiniciar o Windows para que essas alterações tenham efeito. Só ligar iisresetnão funcionou para mim.
Sebastian Krysmanski
-1

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.

Peter Hahndorf
fonte
1
Infelizmente, isso não vai funcionar para mim. Tenho scripts automatizados que geram esses certificados para ambientes locais e de desenvolvimento, e a estação de trabalho de todos os desenvolvedores precisa deles. Além disso, quero a flexibilidade de poder alterar nomes de host sem precisar voltar a terceiros para obter novos certificados.
NathanAldenSr
@NathanAldenSr - Eu entendo. Para um processo totalmente com script, estamos usando uma CA interna local. Seria bom saber se os makecert.execertificados 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.
Peter Hahndorf