Application Load Balancer の HTTPS リスナーにキーアルゴリズムの異なる複数証明書を追加した時にサポートされる暗号スイートを観察してみた

2024.02.29

いわさです。

Application Load Balancer では HTTPS リスナーを構成することが出来ます。
最近各サービスの TLS 1.3 対応状況を確認しているのですが、ALB (Application Load Balancer) については約 1 年前に TLS 1.3 がサポートされています。

私も ALB を作成して HTTPS リスナーに対してsslscanを試してみたところ次のように確認することが出来ました。

% sslscan https://hoge0229.tak1wa.com/
Version: 2.1.3
OpenSSL 3.2.1 30 Jan 2024

Connected to 52.198.151.165

Testing SSL server hoge0229.tak1wa.com on port 443 using SNI name hoge0229.tak1wa.com

SSL/TLS Protocols:
SSLv2     disabled
SSLv3     disabled
TLSv1.0   disabled
TLSv1.1   disabled
TLSv1.2   enabled
TLSv1.3   enabled

:

Supported Server Cipher(s):
Preferred TLSv1.3  128 bits  TLS_AES_128_GCM_SHA256        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_AES_256_GCM_SHA384        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_CHACHA20_POLY1305_SHA256  Curve 25519 DHE 253
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve 25519 DHE 253
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA256       Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-GCM-SHA384   Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-SHA384       Curve 25519 DHE 253

Server Key Exchange Group(s):

:

サポートされている暗号スイートのリストを眺めていて気がついたのですが、以下のドキュメントに記載されているELBSecurityPolicy-TLS13-1-2-2021-06が対応している暗号スイートよりも少ないことに気がつきました。

調べてみれば当たり前ではあったのですが、色々と検証してみたので紹介したいと思います。

ACM (AWS Certificate Manager) 証明書のキーアルゴリズムは複数ある

失念しており気にせずにデフォルトのRSA 2048で作成してしまっていたのですが、そもそも ACM の証明書は複数のキーアルゴリズムをサポートしています。

あーそうなると証明書によって ALB が対応する暗号スイートが変わるのだな、それが原因でドキュメントと総数の際があったのだなと気がついたのですが、複数の暗号スイートに広くサポートしたい場合どうしたら良いのかと気になりました。

これについて、同一ドメインで複数のキーアルゴリズムの証明書に対応する方法を紹介する記事がすでに存在しています。

ALB は同一ドメインに対して複数の証明書を提供することが可能です。

上記記事が 2017 年のものだったので最新でも同じことが可能か確認してみました。
また、証明書が混在したときのサポート暗号スイートの変化についても観察してみることにしました。

異なるキーアルゴリズムの証明書を提供してみる

次のように ACM で同一ドメインで複数の異なるキーアルゴリズムの証明書を作成しておきます。

余談ですが、RSA 2048 を DNS 証明でリクエストしたのですが、他のキーアルゴリズムでも同じ CNAME レコードでした。

そのため、すでに RSA 2048 で証明書の検証が完了している場合は追加の証明書を作成してもすぐに発行済みステータスとなりました。

ALB リスナーへ複数の証明書を追加

最新のマネジメントコンソールだと、以下のリスナー画面から「証明書」タブで設定が可能です。
現在は RSA で作成した冒頭の証明書のみが設定されている状態です。

デフォルト証明書を変更しても良いですし、変更せずに SNI のリスナー証明書へ証明書を追加しても良いです。
デフォルト証明書を変更すると自動で SNI のリスナー証明書へ既存証明書に加えて新しくデフォルト設定した証明書も追加される動きとなります。

今回はデフォルト証明書の変更ボタンから追加の証明書を選択してみます。

デフォルト証明書が変更され、更に SNI 証明書リストへ選択した証明書が追加されています。

ここでsslscanを使ってみます。

% sslscan https://hoge0229.tak1wa.com/
Version: 2.1.3
OpenSSL 3.2.1 30 Jan 2024

:

Supported Server Cipher(s):
Preferred TLSv1.3  128 bits  TLS_AES_128_GCM_SHA256        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_AES_256_GCM_SHA384        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_CHACHA20_POLY1305_SHA256  Curve 25519 DHE 253
Preferred TLSv1.2  128 bits  ECDHE-ECDSA-AES128-GCM-SHA256 Curve 25519 DHE 253
Accepted  TLSv1.2  128 bits  ECDHE-ECDSA-AES128-SHA256     Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-GCM-SHA384 Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-SHA384     Curve 25519 DHE 253
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve 25519 DHE 253
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA256       Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-GCM-SHA384   Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-SHA384       Curve 25519 DHE 253

Server Key Exchange Group(s):

:

暗号スイート追加されていますね。
TLSv1.2 のところですが、ECDSA と RSA どちらもサポートされていることがわかります。

ちなみに証明書リストに複数存在する場合はロードバランサーがあるルールに従って証明書を選択します。
RSA よりも ECDSA、キー長、有効期間などいくつかのルールがあります。詳細は次の公式ドキュメントもご確認ください。

ECDSA のみサポートさせてみる

元々 RSA のみがサポートされており、証明書を追加したところ ECDSA と RSA どちらもサポートされました。
次は ECDSA のみサポートさせれるのか確認してみます。

次のように SNI のリスナー証明書から不要な証明書を削除しました。

% sslscan https://hoge0229.tak1wa.com/
Version: 2.1.3
OpenSSL 3.2.1 30 Jan 2024

:

Supported Server Cipher(s):
Preferred TLSv1.3  128 bits  TLS_AES_128_GCM_SHA256        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_AES_256_GCM_SHA384        Curve 25519 DHE 253
Accepted  TLSv1.3  256 bits  TLS_CHACHA20_POLY1305_SHA256  Curve 25519 DHE 253
Preferred TLSv1.2  128 bits  ECDHE-ECDSA-AES128-GCM-SHA256 Curve 25519 DHE 253
Accepted  TLSv1.2  128 bits  ECDHE-ECDSA-AES128-SHA256     Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-GCM-SHA384 Curve 25519 DHE 253
Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-SHA384     Curve 25519 DHE 253

:

ECDSA のみになりました。

ちなみにクライアントから非対応の暗号スイートを指定された場合はセッションが終了します。(次は RSA のみ対応している ALB に対して ECDSA を指定)
冒頭の記事に記載があったとおりクライアントのサポート状況は気にする必要がありますので注意しましょう。

% curl --tls-max 1.2 --ciphers ECDHE-ECDSA-AES256-GCM-SHA384 -v https://hoge0229.tak1wa.com/ > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host hoge0229.tak1wa.com:443 was resolved.
* IPv6: (none)
* IPv4: 18.181.121.239, 52.198.151.165
*   Trying 18.181.121.239:443...
* Connected to hoge0229.tak1wa.com (18.181.121.239) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ECDHE-ECDSA-AES256-GCM-SHA384
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [179 bytes data]
* TLSv1.2 (IN), TLS alert, close notify (256):
{ [2 bytes data]
* OpenSSL SSL_connect: SSL_ERROR_ZERO_RETURN in connection to hoge0229.tak1wa.com:443 
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* Closing connection
curl: (35) OpenSSL SSL_connect: SSL_ERROR_ZERO_RETURN in connection to hoge0229.tak1wa.com:443

さいごに

本日は Application Load Balancer の HTTPS リスナーにキーアルゴリズムの異なる複数証明書を追加した時にサポートされる暗号スイートを観察してみました。

知らなかったのですが、対応する証明書に応じて複数組み合わせるとサポートされる暗号スイートもどちらも対応されるようになるみたいです。

もし広く対応するのであれば複数キーアルゴリズムの証明書を追加しておいたほうが良いのかな。