Chromeは、HTTPSを介してローカルWebサーバーに接続しているERR_SPDY_INADEQUATE_TRANSPORT_SECURITYを報告します


20

概要

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYHTTPSを使用してローカルWebサーバーに接続しようとすると、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.localWebサイトに証明書を割り当てました

この設定では、証明書やセキュリティ警告なしでChromeからローカルWebサイトにアクセスするのに問題はありませんでした。予想どおり、ブラウザに緑の南京錠が表示されました。

動作しないもの

最近、私はWindows 10にアップグレードしました。当時、Windows 10にHTTP / 2をサポートするIIS 10が付属していることは知りませんでした。現在、Chromeを使用してローカルWebサイトにアクセスしようとすると、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

何が働いている

ホーカン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_SHA
    TLS_RSA_WITH_AES_128_CBC_SHA


誰もが明白なことを指摘する前に:はい、私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「ベストプラクティス」は、このエラーを修正しました。指定したスイート順を使用しようとしましたが、効果はありませんでした。どうやら、WindowsまたはIIS Cryptoのいずれかで修正されているようです。:)
ahwm

回答:


21

https://http2.github.io/http2-spec/#rfc.section.9.2.2によるHttp / 2要件:

9.2.2 TLS 1.2暗号スイート

HTTP / 2 over TLS 1.2の展開では、暗号スイートのブラックリスト(付録A)にリストされている暗号スイートを使用しないでください

エンドポイントは、ブラックリストの暗号スイートの1つがネゴシエートされる場合、タイプ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_P256Windows として識別される)をリストの一番上に置くか、少なくともブラックリストに含まれるものの前に置くだけでしょうか?


すぐにこれを試して、どうなるかをお知らせします。詳細な回答をありがとう!:)正直なところ、この暗号スイートの問題により、ブラウザが矛盾を回避することが保証されるまで、HTTP / 2をHTTP / 1.1と同時に使用することは不可能ではないにしても、本当に難しいと思われます。IPv4 / IPv6、誰か?
NathanAldenSr

IIS Cryptoの「ベストプラクティス」暗号スイートリストをブラックリストと比較しました。私が見つけたのは、ベストプラクティスのTLS_RSA暗号スイートがすべてブラックリストに載っていることです。それらをすべて無効にして再起動しました。しかし、今ではどのブラウザーでローカルWebサイトへの安全な接続を確立できません。私はちょうど得るERR_CONNECTION_RESET。これは証明書自体と関係がありますか?
-NathanAldenSr

@NathanAldenSr ブラックリストに載っていない暗号の優先度が高い限り、ブラックリストに載っている暗号を削除する必要はないと思います(HTTP / 1.xクライアントの互換性の目的に役立つかもしれません)。特に、すべてのHTTP / 2展開が()をサポートしなければならないと述べましたTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
ホーカン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を意味していることに注意してください。
バートヴェルコエイジェン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仕様を満たすように暗号スイート(おそらく順序だけ)を調整すると、問題は適切に解決されます。(別の答えを参照してください)
ホーカンLindqvist

3
これらの変更を有効にするには、Windows再起動する必要があるようです。ただ電話をかけiisresetただけではうまくいきませんでした。
セバスチャンクリスマンスキー

-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.