ロードバランサーに接続しようとすると、セキュアソケットレイヤー (SSL)/Transport Layer Security (TLS) のネゴシエーションエラーが表示されます。このエラーが表示されるのはなぜですか?
簡単な説明
クライアントの TLS ネゴシエーションエラーは、クライアントが開始した TLS 接続がロードバランサーとのセッションを確立できなかったことを意味します。TLS ネゴシエーションエラーは、ロードバランサーのセキュリティポリシーがサポートしていないプロトコルまたは暗号を使用してクライアントがロードバランサーに接続しようとしたときに発生します。TLS 接続を確立するには、クライアントが以下をサポートしていることを確認してください:
- 1 つ以上の一致する暗号
- セキュリティポリシーで指定されたプロトコル
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、使用している AWS CLI が最新バージョンであることを確認してください。
ロードバランサーのセキュリティポリシーを確認してください
AWS マネジメントコンソールから次のように行います:
1. Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
2. ナビゲーションペインの [ロードバランシング] で、[ロードバランサー] を選択します。
3. ロードバランサーを選択し、[リスナー] タブを選択してください。
4. セキュリティポリシーを表示します。
Application Load Balancer と Network Load Balancer については、「セキュリティポリシー」列でセキュリティ・ポリシーを検索してください。
Classic Load Balancer では、「暗号」列の [変更] を選択してセキュリティポリシーを表示します。
AWS CLI から:
ロードバランサーのセキュリティポリシーでサポートされているプロトコルと暗号を決定します
Classic Load Balancer はカスタムセキュリティポリシーをサポートします。ただし、Application Load Balancer と Network Load Balancer はカスタムセキュリティポリシーをサポートしていません。そして、デフォルトのセキュリティポリシーを含むセキュリティポリシーの詳細については、以下を参照してください。
(オプション) ロードバランサーのセキュリティポリシーをテストします
ロードバランサーのセキュリティポリシーでサポートされているプロトコルと暗号をテストするには、sslscan などのオープンソースのコマンドラインツールを使用します。
sslscan コマンドを使用します
sslscan コマンドは、任意の Amazon EC2 Linux インスタンスまたはローカルシステムにインストールすることで実行可能です。テストするロードバランサーが発信元 IP アドレスからの TLS 接続を受け入れるかどうかを確認してください。Amazon Linux EC2 インスタンスで sslscan を使用するには、
1. Extra Packages for Enterprise Linux (EPEL) リポジトリを有効化します。
2. sudo yum install sslscan コマンドを実行します。
3. 次のコマンドを実行して、サポートされている暗号についてロードバランサーをスキャンします。example.com は自身のドメイン名に置き換えてください。
[ec2-user@ ~]$ sslscan --show-ciphers example.com
openssl コマンドを使用します
または、openssl コマンドを使用してロードバランサーのセキュリティポリシーをテストすることもできます。openssl コマンドは、任意の Amazon EC2 Linux インスタンスまたはローカルシステムから実行できます。
特定の SSL/TLS バージョンでサポートされている暗号を一覧表示するには、openssl ciphers コマンドを使用します:
*$* openssl ciphers -v
たとえば、次のコマンドを実行すると、TLS バージョン TLSv1.2 でサポートされている暗号が表示されます:
*$* openssl ciphers -V | grep "TLSv1.2"
s_client コマンドを使用して TLS バージョンと暗号スイートをテストします。特定の暗号スイートの強度を調べるには、 ciphersuites.info などのウェブサイトリポジトリを使用できます。たとえば、次のコマンドを実行すると www.example.com の暗号が表示されます:
openssl s_client -connect example.com:443
たとえば、TLS_PSK_WITH_AES_128_CBC_SHA スイートは弱いと見なされます。スイートをサーバーに対して使用すると、次のエラーが表示されます:
openssl s_client -connect example.com:443 -cipher PSK-AES128-CBC-SHA -quiet
140062732593056:error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers available:s23_clnt.c:508:
ECDHE-RSA-AES128-GCM-SHA256 スイートは強力だと考えられています。スイートをサーバーに対して使用すると、次のような成功メッセージが表示されます:
openssl s_client -connect example.com:443 -cipher ECDHE-RSA-AES128-GCM-SHA256
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 73B49649716645B90D13E29656AEFEBF289A4956301AD9BC65D4832794E282CD
Session-ID-ctx:
Master-Key: C738D1E7160421281C4CAFEA49941895430168A4028B5D5F6CB6739B58A15235F640A5D740D368A4436CCAFD062B3338
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1647375807
Timeout : 300 (sec)
Verify return code: 0 (ok)
openssl コマンドを使用して、接続に使用する TLS プロトコルのバージョンを指定することもできます。次の例は、TLS 1.1 がサーバーでサポートされていることを確認するテストを示しています:
openssl s_client -connect example.com:443 -tls1_1 -quiet
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert Global CA G2
verify return:1
depth=0 CN = *.peg.a2z.com
verify return:1
必要に応じて、ロードバランサーのセキュリティポリシーを更新してください
サポートされているプロトコルまたは暗号を使用し、必要なセキュリティレベルを実現するようにロードバランサーのセキュリティポリシーを更新するには、以下のアクションを実行します。