当我连接到使用 HTTPS 的应用程序负载均衡器时,如何排查客户端 SSL/TLS 协商错误?
我想解决我在使用 HTTPS 连接到应用程序负载均衡器时遇到的客户端 SSL/TLS(安全套接字层/传输层安全)协商错误。
简短描述
当客户端 TLS 无法与应用程序负载均衡器建立 SSL 会话时,就会出现协商错误。之所以出现该错误,是因为负载均衡器的安全策略不支持发起连接的客户端的安全协议或加密算法套件。该错误会导致 clientTLSnegotiationErrorCount 指标上升。
要建立安全连接,请确保客户端的初始 SSL/TLS 握手满足以下要求:
解决方法
在 ClientTLSNegotiationErrorCount 指标上升的时间段内,查看应用程序负载均衡器的连接日志。日志中会显示客户端向应用程序负载均衡器提供的安全协议和加密算法。
**注意:**请确保您激活了连接日志。或者,如果您有权访问连接失败的客户端,请捕获数据包,然后查看 Client Hello 数据包。有关数据包捕获测试的详细信息,请参阅如何对 VPC 中的 EC2 Linux 或 Windows 实例与本地主机之间通过互联网网关通信时的网络性能问题进行故障排除?
确定负载均衡器的安全策略所支持的协议和加密算法
应用程序负载均衡器不支持自定义安全策略。有关安全策略(包括默认安全策略)的更多信息,请参阅应用程序负载均衡器安全策略。
您可以通过两种方式查看应用程序负载均衡器附加的安全策略:
- 使用 Amazon Elastic Compute Cloud (Amazon EC2) 控制台。
- 使用 AWS 命令行接口 (AWS CLI) 和 describe-listeners 命令。
注意: AWS CLI 部分假定您的设置满足以下前提条件:
- AWS CLI 配置的用户具有相应的 IAM 权限,可以对弹性负载均衡服务执行describe(描述)命令。
- 如果在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI。
通过 Amazon EC2 控制台
要查看安全策略,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中的 Load Balancing(负载均衡)下,选择 Load Balancers(负载均衡器)。
- 选择您想要的应用程序负载均衡器。然后,选择 Listeners and rules(侦听器和规则)。
- 在表中,展开 Security Policy(安全策略)列。查看受支持的安全协议和加密算法套件。
通过 AWS CLI
要查看安全策略,请运行以下命令:
-
要找到应用程序负载均衡器的 Amazon 资源名称 (ARN),请运行 describe-load-balancers 命令:
aws elbv2 describe-load-balancers --region your_region | grep 'LoadBalancerName\|LoadBalancerArn'
-
要找到应用程序负载均衡器的安全策略,请运行 describe-listeners 命令:
aws elbv2 describe-listeners --region your_region --load-balancer-arn your_loadbalancer_arn | grep 'SslPolicy'
注意: 将 your_region 替换为包含您的资源的区域。将 your_loadbalancer_arn 替换为您的负载均衡器的 ARN。
使用连接日志来确定客户端提供的安全协议和加密算法套件
使用 Amazon Simple Storage Service (Amazon S3) 控制台来解压缩连接日志并显示其中的信息。然后,下载文件以供进一步审查。
**注意:**使用 bash 工具 zcat 、awk 和 sed 来处理连接日志。
bash 工具 awk 会解析日志中的以下字段编号或值:
($1) timestamp ($2) client_ip ($3) client_port ($4) listener_port ($5) tls_protocol ($6) tls_cipher ($7) tls_handshake_latency ($8) leaf_client_cert_subject ($9) leaf_client_cert_validity ($10) leaf_client_cert_serial_number ($11) tls_verify_status
以下各部分描述了可用于处理连接日志的不同方法。
确定连接日志中包含的时间段
注意: 记录的时间值为 UTC 时间。
zcat *.log.gz | gawk '{print substr($1,0,16)}'| sort | uniq | sed '1p;$!d' 2024-03-30T18:14 2024-03-30T19:04
识别或比较连接日志中存在的错误
**注意:**tls_verify_status 字段主要用于 mTLS 连接。但是,该字段可用于显示因一个或多个协议或加密算法套件不匹配而失败的 TLS 连接尝试。
zcat *.log.gz | gawk '{print $11}' | sort | uniq -c | sort -r 1354 Failed:UnmappedConnectionError 176 Success
识别显示最多连接错误的唯一客户端
zcat *.log.gz | gawk '$11 ~ "Failed"' | gawk '{print $2}' | sort | uniq -c | sort -r 440 a.a.a.a 436 b.b.b.b 386 c.c.c.c 90 d.d.d.d 1 e.e.e.e 1 f.f.f.f
识别客户端使用的加密算法套件和协议
注意协议、加密算法套件以及随后的错误。
zcat *.log.gz | gawk '($11 ~ "Failed" && $6 != "-")' | gawk '{print $2,$5,$6,$11}' | sort | uniq -c | sort -r 40 a.a.a.a TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError 30 b.b.b.b TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError 15 c.c.c.c TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError 2 d.d.d.d TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError 2 e.e.e.e TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError 1 f.f.f.f TLSv1.2 ECDHE-RSA-AES256-SHA Failed:UnmappedConnectionError
使用数据包捕获来确定客户端提供的安全协议和加密算法套件
在发起连接的客户端上捕获数据包后,查看发送到应用程序负载均衡器的 Client Hello 数据包。
使用 Tshark 捕获数据包
**注意:**您也可以使用 Wireshark (GUI) 代替 Tshark(终端)来分析数据包捕获。
Tshark 示例使用以下信息:
- 客户端 IP 地址: 192.168.150.100
- 应用程序负载均衡器 IP 地址: 10.10.10.10
- 目标端口: 443
完成以下步骤:
**注意:**将 your_file.pcapng 替换为您的文件名。
-
要查找客户端和应用程序负载均衡器 IP 地址之间的对话中的所有数据包,请运行以下命令:
tshark -r your_file.pcapng '(ip.addr == 10.10.10.10 && tcp.port == 443)' 69 1.428028 192.168.150.100 → 10.10.10.10 TCP 66 61747 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1 70 1.481769 10.10.10.10 → 192.168.150.100 TCP 66 443 → 61747 [SYN, ACK] Seq=0 Ack=1 Win=26883 Len=0 MSS=1460 SACK_PERM=1 WS=256 71 1.481905 192.168.150.100 → 10.10.10.10 TCP 54 61747 → 443 [ACK] Seq=1 Ack=1 Win=131328 Len=0 72 1.490709 192.168.150.100 → 10.10.10.10 TLSv1 244 Client Hello 74 1.541926 10.10.10.10 → 192.168.150.100 TCP 56 443 → 61747 [ACK] Seq=1 Ack=191 Win=28160 Len=0 75 1.541926 10.10.10.10 → 192.168.150.100 TCP 56 [TCP Dup ACK 74#1] 443 → 61747 [ACK] Seq=1 Ack=191 Win=28160 Len=0 76 1.541926 10.10.10.10 → 192.168.150.100 TLSv1.2 61 Alert (Level: Warning, Description: Close Notify) 77 1.541926 10.10.10.10 → 192.168.150.100 TCP 56 443 → 61747 [FIN, ACK] Seq=8 Ack=191 Win=28160 Len=0 78 1.542087 192.168.150.100 → 10.10.10.10 TCP 54 61747 → 443 [ACK] Seq=191 Ack=9 Win=131328 Len=0 79 1.543501 192.168.150.100 → 10.10.10.10 TCP 54 61747 → 443 [FIN, ACK] Seq=191 Ack=9 Win=131328 Len=0 95 1.614454 10.10.10.10 → 192.168.150.100 TCP 56 443 → 61747 [ACK] Seq=9 Ack=192 Win=28160 Len
上方的输出显示了以下信息:
客户端 (192.168.15.100) 发起了与应用程序负载均衡器 (10.10.10.10) 的连接。
在初始 TCP 握手(SYN、SYN-ACK、ACK)后不久,Client Hello(数据包 72) 之后的是来自应用程序负载均衡器的 ACK。
然后,应用程序负载均衡器发出关闭通知(数据包 76),显示会话必须关闭。 -
找到 Client Hello 数据包中使用的 SSL/TLS 协议和加密算法套件。这些数据包用于客户端 IP 地址 (192.168.15.100) 和负载均衡器的 IP 地址 (10.10.10.10) 之间的会话。
要将对话的 Client Hello 数据包 (tls.handshake.type == 1) 移至其自有的 PCAP 文件中,请运行以下命令:
tshark -r your_file.pcapng -O -P -w ALB_Sessions.pcap '(ip.addr == 10.10.10.10 && tcp.port == 443) && (tls.handshake.type==1)'
-
要将加密算法套件信息从 ALB_Sessions.pcap 文件移至文本文件中,请运行以下命令:
tshark -r ALB_Sessions.pcap -Y ssl.handshake.ciphersuites -Vx > TLS_outfile.txt
-
要拼接文件并使用 grep 来搜索 Version: 字段,请运行以下命令。查看 Client Hello 数据包中使用的 TLS 版本。
cat TLS_outfile.txt | grep "Version:" 0100 .... = Version: 4 Version: TLS 1.0 (0x0301) Version: TLS 1.2 (0x0303)
-
要拼接文件并使用 grep 来搜索 Cipher Suite: 字段,请运行以下命令。查看 Client Hello 数据包中使用的加密算法套件。
cat TLS_outfile.txt | grep "Cipher Suite:" Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014) Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
-
要将十六进制值与原始文件进行比较,请运行以下命令:
tshark -r your_file.pcapng -T fields -Y '(tls.handshake.type==1 && ip.addr == 10.10.10.10)' -e tls.handshake.version -e tls.handshake.ciphersuite 0x0303 0xc014,0x00ff
该命令会读取 your_file.pcapng 文件,并针对发送到应用程序负载均衡器的 IP 地址 (10.10.10.10) 的 Client Hello 数据包对文件进行解析。然后,该命令将 tls.handshake.version 和 tls.handshake.ciphersuites 打印为单独的列。比较输出以确认这些是出现在 TLS_outfile.txt 文件中的十六进制值。
分析数据包捕获
在此示例中,客户端提供的唯一加密算法套件是 **TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA。**此信息遵循 IANA 命名架构,但应用程序负载均衡器使用 OpenSSL 命名架构。
**注意:**使用此表将 IANA 转换为 OpenSSL 命名架构。TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 等于 ECDHE-RSA-AES256-SHA。
更新负载均衡器的安全策略
要接纳客户端支持的协议或加密算法,请执行以下操作:
- 打开 Amazon EC2 控制台。
- 在导航窗格中,选择 Load Balancers(负载均衡器)。
- 选择负载均衡器。
- 在 Listeners and rules(侦听器和规则)选项卡中,选择 Protocol:Port 列中的文本,以打开侦听器的详细信息页面。
- 在 Details(详细信息)页面上,选择 Actions(操作),然后选择 Edit listener(编辑侦听器)。
- 在 Secure listener settings(安全侦听器设置)部分中,对于 Security policy(安全策略),请选择新的安全策略。
- 选择 Save changes(保存更改)。
更新客户端支持的安全协议和加密算法套件
要更新客户端支持的安全协议和加密算法套件,请参阅发送请求的设备的操作系统文档。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前