Chrome에서 HTTPS를 통해 로컬 웹 서버에 연결하는 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY보고


20

개요

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYHTTPS를 통해 로컬 웹 서버에 연결하려고 할 때 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.local127.0.0.1
  4. myapp.local도메인에 바인딩되고 HTTPS 요청 만 수신 하는 IIS 8.5 응용 프로그램을 만들었습니다.
  5. myapp.local웹 사이트에 인증서 할당

이 설정을 사용하면 인증서 또는 보안 경고없이 Chrome에서 로컬 웹 사이트에 액세스하는 데 어려움이 없었습니다. 브라우저가 예상대로 녹색 자물쇠를 표시했습니다.

작동하지 않는 것

최근에 Windows 10으로 업그레이드했습니다. 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
  • 사용 가능한 암호 : Triple 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åkan 고 Lindqvist의 답변에 따라, 그리고 매우 상세하고 분명-철저하게 연구 된 대답 여기에 , 나는 크롬 오류를 제거 다음과 같은 설정으로 IIS 암호화를 재구성 :

  • 사용 가능한 프로토콜 : 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_SHAES
    TLS_RSA_WITH_AES_256_CBC_SHATH
    TLS_RSA_WITH_AES_128_GCM_SHA256


누군가가 명백한 것을 지적하기 전에 : 예, 나는 makecert.exe더 이상 사용되지 않는다는 것을 알고 있습니다. [이용 했습니까?] 가장 쉬운 옵션이므로 이와 같은 개발 시나리오에만 사용합니다.
NathanAldenSr

암호가 아니라 활성화 된 ssl / tls 버전 일 수 있습니다. tls v1.0 이하를 사용하도록 설정 했습니까?
Drifter104

IIS Crypto로 수행 한 작업을 포함하여 해당 설정을 제어하도록 질문을 업데이트했습니다. HTTP / 2 및 Chrome에 대한 설정이 너무 허용 적인지 알고 있습니까?
NathanAldenSr

stackoverflow.com/questions/31746620/… 도움이 될 수 있습니다. 분명히 브라우저에서 SPDY를 비활성화 갈 수있는 방법입니다
Drifter104

1
버전 2.0의 IIS Crypto "Best Practices"는이 오류를 해결했습니다. 지정한 스위트 순서를 사용했지만 효과가 없습니다. 분명히 그것은 길 어딘가에 Windows 또는 IIS Crypto에서 수정되었습니다. :)
ahwm

답변:


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 절)를 생성하도록 선택할 수 있습니다. 차단 된 암호 그룹을 사용하도록 선택한 배포는 잠재적 피어 집합이 해당 암호 그룹을 허용하는 것으로 알려진 경우가 아니라면 연결 오류를 트리거 할 위험이 있습니다.

블랙리스트에없는 암호 그룹의 협상에 대한 응답으로 구현시이 오류를 생성해서는 안됩니다 (MUST NOT). 따라서 클라이언트가 블랙리스트에없는 암호 그룹을 제공 할 때 해당 암호 그룹을 HTTP / 2와 함께 사용할 수 있도록 준비해야합니다.

블랙리스트에는 TLS 1.2가 필수로 만드는 암호화 제품군이 포함되어 있습니다. 즉, TLS 1.2 배포는 교차되지 않는 허용되는 암호화 제품군을 가질 수 있습니다. TLS 핸드 셰이크 실패를 유발하는이 문제를 방지하려면 TLS 1.2를 사용하는 HTTP / 2의 배치는 P-256 타원 곡선과 함께 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE]를 지원해야합니다 [FIPS186].

클라이언트는 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_P256Windows에서 식별 )을 목록의 맨 위에 놓거나 최소한 블랙리스트에 포함 된 항목 앞에 놓는 것입니까?


나는 이것을 즉시 시도하고 그것이 어떻게 나타나는지 알려줄 것입니다. 자세한 답변 감사합니다! :) 솔직히이 암호 스위트 문제로 인해 HTTP / 1.1과 동시에 HTTP / 2를 사용하면 브라우저가 불일치를 해결할 수있을 때까지 불가능하지는 않지만 실제로 까다로운 것처럼 보입니다. IPv4 / IPv6, 누구?
NathanAldenSr

IIS Crypto의 "모범 사례"암호 제품군 목록과 블랙리스트를 비교했습니다. 내가 찾은 것은 모든 모범 사례 TLS_RSA암호 스위트가 블랙리스트에 있다는 것입니다. 나는 그들을 모두 비활성화하고 재부팅했다. 그러나, 지금은 내 로컬 웹 사이트에 대한 보안 연결을 설정할 수 없습니다 어떤 브라우저를. 나는 단지 얻는다 ERR_CONNECTION_RESET. 이것이 인증서 자체와 관련이 있습니까?
NathanAldenSr

@NathanAldenSr 블랙리스트에없는 암호의 우선 순위가 높은 한, 블랙리스트에있는 암호 를 제거 할 필요는 없다고 생각합니다 (HTTP / 1.x 클라이언트의 호환성 목적에 유용 할 수 있음). 특히 모든 HTTP / 2 배포는 반드시 ( TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)를 지원 해야 한다고 언급했습니다 .
Håkan Lindqvist

1
시작해 주셔서 감사합니다. 나는 나를 위해 일한 것을 보여주기 위해 대답을 업데이트했습니다.
NathanAldenSr

1
참고는 HTTP / 2 스펙은 그것의 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256을 말한다 : 문자열을 의미하는 P-256 타원 곡선 [FIPS186] TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256Windows 용입니다.
Bart Verkoeijen

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 사양을 충족하도록 암호 제품군 (순서대로)을 조정하면 문제가 올바르게 해결됩니다. (별도의 답변을 참조)
는 Håkan 고 Lindqvist에게

3
이러한 변경 사항을 적용하려면 Windows다시 시작 해야합니다. 전화 iisreset만해도 속임수가되지 않았습니다.
Sebastian Krysmanski

-1

적절한 CA에서 인증서를 받으면 무료 인증서 ( StartSSL ) 가 있으며 인증서를 얻는 데 훨씬 오래 걸리지 않습니다.

올바른 인증서를 사용할 때 Windows 10에서 IIS 10을 사용하고 Chrome에서 HTTP / 2를 사용하는 데 아무런 문제가 없었습니다.


1
불행히도 이것은 나를 위해 작동하지 않습니다. 로컬 및 개발 환경 모두에 대해 이러한 인증서를 생성하는 자동화 된 스크립트가 있으며 모든 개발자의 워크 스테이션에 필요합니다. 또한 새로운 인증서를 얻기 위해 타사로 돌아 가지 않고도 호스트 이름을 유연하게 변경할 수 있기를 바랍니다.
NathanAldenSr

@NathanAldenSr-이해합니다. 완전히 스크립팅 된 프로세스를 위해 로컬 내부 CA를 사용하고 있습니다. makecert.exe자체 생성 인증서가 문제 인지 여부를 아는 것이 좋습니다 . 나는 makecert.exe를 사용하지 않았으며 항상 로컬 CA가 훨씬 깨끗한 솔루션이라고 생각했습니다.
피터 한 도르프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.