HTTP/2を利用する際はCipher Suiteを正しく設定しよう
2021年12月09日 木曜日
CONTENTS
【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であれば閲覧することが出来ます。
特に、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サーバの設定方法などについてはインターネット上で調べれば様々な情報が入手できますが、モダンなサイトにはモダンな設定を。
各サーバに指定するパラメータも、最新の環境に合わせたものにアップデートしていきましょう。