跳至内容

在连接到负载均衡器时,为什么会出现客户端 SSL/TLS 协商错误?

3 分钟阅读
0

我想解决连接弹性负载均衡器 (ELB) 时发生的 SSL/TLS 协商错误。

简短描述

当客户端无法与负载均衡器协商安全连接时,将会出现此错误。该问题通常是由不支持的密码或协议版本引起的。

要建立 TLS 连接,请确认您的客户端支持负载均衡器安全策略中定义的至少一个密码和协议。

解决方法

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

确定负载均衡器的安全策略

要确定您的负载均衡器的安全策略,请完成以下步骤:

  1. 打开 Amazon Elastic Compute Cloud (Amazon EC2) 控制台
  2. 在导航窗格中的 Load Balancing(负载均衡)下,选择 Load Balancers(负载均衡器)。
  3. 选择负载均衡器,然后选择 Listeners(侦听器)。
  4. 查看安全策略。
    对于应用程序负载均衡器和网络负载均衡器,在 Security policy(安全策略)列中找到安全策略。
    对于经典负载均衡器,在 Cipher(密码)列中选择 Change(更改),以查看安全策略。

要使用 AWS CLI,请运行以下命令之一:

确定支持的协议和密码

经典负载均衡器支持自定义安全策略。但是,应用程序负载均衡器和网络负载均衡器不支持自定义安全策略。

有关安全策略的详细信息,请参阅以下文档:

(可选)测试负载均衡器的安全策略

测试负载均衡器的安全策略所支持的协议和密码。使用开源命令行工具,例如 sslscanopenssl

有关详细信息,请参阅 GitHub 网站上的 sslscan

使用 sslscan 命令

在 Amazon Linux EC2 实例上或从您的本地系统安装并运行 sslscan 命令。确保您的负载均衡器接受来自您的源 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

    **注意:**Amazon Linux 2023 (AL2023) 不支持 EPEL。

使用 openssl 命令

要测试负载均衡器的安全策略,您也可以使用 openssl 命令。在 Amazon Linux EC2 实例上或从您的本地系统运行 openssl 命令。

要列出特定 SSL/TLS 版本支持的密码,请运行以下命令:

*$* openssl ciphers -v

以下命令显示 TLS 版本 TLS 1.2 支持的密码:

*$* openssl ciphers -V | grep "TLSv1.2"

运行 s_client 命令以测试 TLS 版本和密码套件。要了解特定密码套件的强度,请使用第三方网站存储库,例如 TLS Ciphersuite Search。例如,如果您运行以下命令,则输出将显示 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)

要指定连接中使用的 TLS 协议版本,请运行 openssl 命令。以下示例显示了一个测试,用于验证服务器是否支持 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

(可选)检查应用程序负载均衡器的连接日志和网络负载均衡器的访问日志

如果您的客户端连接应用程序负载均衡器的 HTTPS 侦听器,请使用连接日志来检查协议和密码。用于连接的协议和密码位于 tls_protocoltls_cipher 字段中。如果 TLS 协商失败,则 tls_verify_status 字段设置为 Failed:$error_codetls_protocoltls_cipher 字段设置为“-”。

如果您的客户端连接了网络负载均衡器的 TLS 侦听器,请使用访问日志来检查协议和密码。用于连接的协议和密码位于 tls_protocol_versiontls_cipher 字段中。如果 TLS 协商失败,则不会记录访问日志。

有关详细信息,请参阅应用程序负载均衡器的连接日志网络负载均衡器的访问日志

更新负载均衡器的安全策略

要使用支持的协议或密码来提高安全性,请更新负载均衡器的安全策略。有关如何更新安全策略的详细信息,请参阅以下文档: