HTTP/2を利用する際はCipher Suiteを正しく設定しよう

2021年12月09日 木曜日


【この記事を書いた人】
熊本 祐

2018年新卒入社。名古屋支社にてSI中心にお仕事をするエンジニア。仕事ではサーバやミドルウェアを、趣味ではウェブやアプリを弄っています。

「HTTP/2を利用する際はCipher Suiteを正しく設定しよう」のイメージ

IIJ 2021 TECHアドベントカレンダー 12/9(木)の記事です】

はじめに

名古屋支社の kmmt-t です。

最近のモダンなWebサイトでは、「HTTP/2」を利用するサイトが増えてきました。

このようなWebサイトを公開する際に、Webサーバ側の設定次第によってはモダンブラウザ(EdgeやChrome)でページを開けない場合があります。

具体的にはTLS1.2とHTTP/2を組み合わせたWebサイトにおいて、特定のCipher Suiteを指定している場合にブラウザが ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY 等のエラーを出してページをブロックするような現象が発生します。

特に、利用者側がインターネットアクセス時にSSLを復号してセキュリティ検査(SSL Inspection)をするような機器を挟んでいる場合は発生する可能性があります。

利用者側でエラーを回避するためには復号処理のスキップなどエンドユーザのセキュリティを低下させる設定が必要となるため、サーバ側で適切な設定をする方が望ましいでしょう。

一部のCipher SuiteはHTTP/2では非推奨

本事象の原因はRFCに記載されています。

HTTP/2のRFCであるRFC7540のAppendix Aには以下のような記載があります。

Appendix A. TLS 1.2 Cipher Suite Black List

An HTTP/2 implementation MAY treat the negotiation of any of the
following cipher suites with TLS 1.2 as a connection error

要約するならば

HTTP/2実装として、後述するTLS1.2のCipher Suiteを使ったTLSネゴシエーションをコネクションエラーとして扱っても良い

というものです。

実際に、Google Chromeや同ブラウザと同じChromiumを採用したMicrosoft Edge、Firefoxなどのモダンブラウザでは以下のようなエラーとなって表示ができません。

Google Chromeの場合 Microsoft Edgeの場合 Mozilla Firefoxの場合
ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY NS_ERROR_NET_INADEQUATE_SECURITY

一方で、旧式のブラウザエンジンを利用するIE11モードをオンにしたMicrosoft Edgeであれば閲覧することが出来ます。

Microsoft Edgeの正常表示画面

Microsoft Edge(IE11モード)の場合

特に、SSL Inspectionをするプロキシやファイアウォールなどが中間にある場合、上記のエラーが発生する場合があります。

メーカにもよりますが、ブラウザがブロックするようなCipher Suiteであっても中間機器ではエラーが出ないため、SSL Inspectionを行う機器が適切ではないCipherを中継してしまう場合があるようです。

エラーが発生するCipher Suite

具体的な一覧は上記のRFC7540のAppendix Aに記載がありますが、例えばIPAが提供している「TLS暗号設定ガイドライン」に記載された「推奨セキュリティ型」の暗号スイートであっても、以下の表における赤字のCipher Suiteは全てHTTP/2で接続した場合にブラウザがブロックする場合があります。

ECDHE-ECDSA-AES128-GCM-SHA256 DHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-CAMELLIA128-SHA256 DHE-RSA-CAMELLIA128-SHA256
ECDHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES128-CCM ECDHE-ECDSA-AES256-SHA384 DHE-RSA-AES256-SHA256
ECDHE-ECDSA-AES128-CCM DHE-RSA-AES128-CCM8 ECDHE-RSA-AES256-SHA384 DHE-RSA-CAMELLIA256-SHA256
ECDHE-ECDSA-AES128-CCM8 DHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-CAMELLIA256-SHA384 DHE-RSA-AES128-SHA
ECDHE-ECDSA-AES256-GCM-SHA384 DHE-RSA-AES256-CCM ECDHE-RSA-CAMELLIA256-SHA384 DHE-RSA-CAMELLIA128-SHA
ECDHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-CCM8 ECDHE-ECDSA-AES128-SHA DHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-CCM DHE-RSA-CHACHA20-POLY1305 ECDHE-RSA-AES128-SHA DHE-RSA-CAMELLIA256-SHA
ECDHE-ECDSA-AES256-CCM8 ECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-CHACHA20-POLY1305 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-SHA
ECDHE-RSA-CHACHA20-POLY1305 ECDHE-ECDSA-CAMELLIA128-SHA256 DHE-RSA-AES128-SHA256

上記以外にも、合計276種類のCipher Suiteが「コネクションエラーとして扱っても良いCipher Suite」として列挙されており、その一部はTLS1.2では従来まで一般的に利用されてきたCipher Suiteも含まれています。

対策方法

対策1. 暗号スイート優先順序をサーバ側で指定する

上述したIPAのTLS暗号設定ガイドラインにおいても、暗号スイートを設定する場合は「SSLHonorCipherOrder」や「ssl_prefer_server_ciphers」のような暗号スイートの優先順序をサーバ側で指定することが推奨されています。

こういった設定を実施し、脆弱なCipher Suiteが利用されることを回避することができます。

対策2. HTTP/2でも利用可能なCipherのみ指定する

また、上記の表における黒字のモノ(≒HTTP/2でも利用可能なCipher Suite)のみを追加という選択肢もあります。

これはIPAのTLS暗号設定ガイドラインにおける「高セキュリティ型」の暗号スイート設定と同様の内容になっており、HTTP/2とTLS1.2の組み合わせにおいて全ての暗号スイートが問題なく表示可能な組み合わせとなっています。

実際、高セキュリティ型の暗号スイートを指定したWebサーバに対して、testssl.shを利用したクライアントシミュレーション(端末が対象サーバのSSL/TLSに対応しているかを再現するもの)においては既にサポートが終了した旧式の環境を除いた全ての環境でアクセスが可能という判定になっています。

 Running client simulations (HTTP) via sockets 
Android 4.4.2 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Android 5.0.0 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Android 6.0 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Android 7.0 (native) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Android 8.1 (native) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Android 9.0 (native) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Android 10.0 (native) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Chrome 74 (Win 10) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Chrome 79 (Win 10) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Firefox 66 (Win 8.1/10) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Firefox 71 (Win 10) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
IE 6 XP No connection
IE 8 Win 7 No connection
IE 8 XP No connection
IE 11 Win 7 No connection
IE 11 Win 8.1 No connection
IE 11 Win Phone 8.1 No connection
IE 11 Win 10 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Edge 15 Win 10 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Edge 17 (Win 10) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Opera 66 (Win 10) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Safari 9 iOS 9 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Safari 9 OS X 10.11 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Safari 10 OS X 10.12 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Safari 12.1 (iOS 12.2) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Safari 13.0 (macOS 10.14.6) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Apple ATS 9 iOS 9 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Java 6u45 No connection
Java 7u25 No connection
Java 8u161 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Java 11.0.2 (OpenJDK) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
Java 12.0.1 (OpenJDK) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
OpenSSL 1.0.2e TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  256 bit ECDH (P-256)
OpenSSL 1.1.0l (Debian) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
OpenSSL 1.1.1d (Debian) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)
Thunderbird (68.3) TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256  253 bit ECDH (X25519)

特に理由がなければ、Cipher Suiteの設定は「高セキュリティ型」として設定しておくほうが良いかもしれません。

最後に

HTTP/2もTLS1.2も、最先端という段階はすでに脱して普及段階に入っているかなというプロトコルです。

大手の新聞社やニュースサイト、ポータルサイトなども次々と採用している様子が見受けられます。

Webサーバの設定方法などについてはインターネット上で調べれば様々な情報が入手できますが、モダンなサイトにはモダンな設定を。

各サーバに指定するパラメータも、最新の環境に合わせたものにアップデートしていきましょう。

IIJ Engineers blog読者プレゼントキャンペーン
  • Twitterフォロー&条件付きツイートで、
    「IoT米」と「バリーくんストラップ」のセットを抽選で20名にプレゼント!
    応募期間は2021/12/01~2021/12/31まで。詳細はこちらをご覧ください。
    今すぐツイートするならこちら→ フォローもお忘れなく!

熊本 祐

2021年12月09日 木曜日

2018年新卒入社。名古屋支社にてSI中心にお仕事をするエンジニア。仕事ではサーバやミドルウェアを、趣味ではウェブやアプリを弄っています。

Related
関連記事