跳至内容

如何识别和解决在使用 mTLS 和应用程序负载均衡器时出现的客户端连接问题?

3 分钟阅读
0

我想解决在使用相互传输层安全性协议 (mTLS) 和应用程序负载均衡器时遇到的客户端连接问题。

简短描述

要调查客户端连接问题,必须激活应用程序负载均衡器的连接日志。使用连接日志来分析请求模式并对问题进行故障排除。

有关连接日志提供哪些信息的更多说明,请参阅监控应用程序负载均衡器

解决方法

应用程序负载均衡器的连接日志可识别在客户端尝试连接到应用程序负载均衡器时遇到的错误。
**注意:**有关处理错误的方法,请参阅处理连接日志文件

筛选连接日志以查看特定错误

按客户端的 IP 地址来筛选连接日志以查找错误。

  1. 运行以下命令来查找失败的请求:

    zcat *.log.gz | awk '($2 == "a.a.a.a" && $11 ~ "Failed")' | awk '{print $1, $5, $6, $8, $9, $10, $11, $12}'

    **注意:**将 a.a.a.a 替换为您正在调查错误的客户端 IP 地址。

    输出示例:

    2024-04-05T18:31:29.268987Z TLSv1.3 ECDHE-RSA-AES256-SHA "CN=client-expired.alb-mtls-example.com,OU=IT,O=Company LLC,L=City,ST=State,C=US" NotBefore=2024-01-02T19:17:20Z;NotAfter=2024-04-02T19:17:20Z 02 "Failed:ClientCertExpired"
    2024-04-05T19:29:35.128387Z TLSv1.3 ECDHE-RSA-AES256-SHA "CN=client-expired.alb-mtls-example.com,OU=IT,O=Company LLC,L=City,ST=State,C=US" NotBefore=2024-01-02T19:17:20Z;NotAfter=2024-04-02T19:17:20Z 02 "Failed:ClientCertExpired"
    2024-04-05T20:16:44.387952Z TLSv1.3 ECDHE-RSA-AES256-SHA "CN=client-expired.alb-mtls-example.com,OU=IT,O=Company LLC,L=City,ST=State,C=US" NotBefore=2024-01-02T19:17:20Z;NotAfter=2024-04-02T19:17:20Z 02 "Failed:ClientCertExpired"
  2. tls_verify_status 字段获取错误代码。

  3. 请参阅错误原因代码以识别错误。

  4. 参考以下部分来解决特定错误。

错误: "ClientCertCrlHit"

当客户端证书存在于 mTLS 侦听器使用的证书吊销列表 (CRL) 中时,就会出现此错误。

  1. 查看显示 leaf_client_cert_subject 字段的连接日志条目。
  2. 从 Amazon Simple Storage Service (Amazon S3) 存储桶下载 CRL 文件。Amazon Elastic Compute Cloud (Amazon EC2) 信任库引用了 CRL 文件。
  3. 查看 CRL 以获取在日志条目中标识的客户端证书。
  4. 针对 EC2 信任库使用的 CA 捆绑包续订客户端证书。使用新的未吊销证书来重新尝试连接。

错误: "ClientCertCrlProcessingError"

当证书吊销列表 (CRL) 遇到处理错误时,就会出现此错误。

要解决此错误,请执行以下步骤:

  1. 在连接日志中记录与此错误相关的时间戳。
  2. 确认客户端证书符合规定的要求
  3. 确保配置的 CRL 未超过定义的配额

如果您仍然遇到错误,请联系 AWS Support 进行进一步审查。向 AWS Support 工程师提供以下信息:

  • 以下 curl 命令的输出:

     curl -vvv -X HTTP_action --cert client-cert.crt --key client_key.pem https://alb.fqdn.com -A credstest

    **注意:**请将 HTTP_action 替换为您的 HTTP 操作,将 client-cert.crt 替换为您的证书文件名,并将 client_key.pem 替换为您的密钥文件名。

  • 客户端证书(不要提供密钥文件)

  • 问题发生时段的连接日志

错误: "ClientCertExpired"

当客户端证书过期时,会发生此错误。

要解决此错误,请执行以下步骤:

  1. 检查证书的有效期。您可以在连接日志的 leaf_client_cert_validity 字段中找到这个值。

  2. 对证书文件运行以下命令:

    openssl x509 -in $i --text | grep -A 2 "Validity"
  3. 对照连接日志的 timestamp(时间戳)字段,检查步骤 2 中提供的 "Not After"(不得晚于)日期。
    **注意:**请确保仅在 "Not After"(不得晚于)日期之前使用客户端证书。

  4. 要解决此错误,请使用 EC2 信任库引用的 CA 证书捆绑包来重新颁发客户端证书。

错误: "ClientCertInvalid"

出现此错误是因为客户端证书无效。

要解决此错误,请执行以下步骤:

  1. 验证客户端证书是否符合要求,以便可以与 mTLS 和应用程序负载均衡器一起使用。
  2. 重新颁发证书。

错误: "ClientCertMaxChainDepthExceeded"

出现此错误是因为客户端证书的数量超过了最大链深度。

要解决此错误,请执行以下步骤:

  1. 确认向应用程序负载均衡器提供的客户端证书中的证书数量。

  2. 要检查证书链深度,请使用以下任一选项:

    **Windows:**选择证书,然后选择 Certificate path(证书路径)。然后,计算证书数量。
    -or-
    在 Microsoft PowerShell 中运行以下命令并计算证书数量:

    certutil -dump client-cert.crt

    注意: 请将 client-cert.crt 替换为您的证书文件名。

    **Linux 或 Unix:**要计算证书数量,请运行以下命令:

    openssl crl2pkcs7 -nocrl -certfile client-cert.crt | openssl pkcs7 -print_certs -noout | grep "subject" | wc -l

    注意: 请将 client-cert.crt 替换为您的证书文件名。

  3. 减少客户端证书链中存在的证书数量。有关支持的最大证书链深度的更多信息,请参阅应用程序负载均衡器的配额

错误: "ClientCertMaxSizeExceeded"

出现此错误是因为超过了最大客户端证书文件大小。

要解决此错误,请执行以下步骤:

  1. 验证客户端证书的文件大小:
    **Windows:**选择文件。然后,选择属性并查看文件大小。
    **Linux:**运行 du -h 文件
    注意: 请将 file 替换为您的文件名。
    **Macintosh:**在“访达”中选择项目,然后按 Command-I
  2. 减小提供给应用程序负载均衡器的客户端证书文件的大小。有关支持的最大证书文件大小的更多信息,请参阅应用程序负载均衡器的配额

错误: "ClientCertNotYetValid"

出现此错误是因为客户端证书尚未生效。

要解决此错误,请执行以下步骤:

  1. 检查证书的有效期。您可以在连接日志的 leaf_client_cert_validity 字段中找到这个值。

  2. 对证书文件运行以下命令:

    openssl x509 -in $i --text | grep -A 2 "Validity"
  3. 对照连接日志的时间戳字段,检查步骤 2 中提供的 "Not Before"(不得先于)日期。
    **注意:**请确保客户端证书仅在 "Not Before"(不得先于)日期之后使用。

  4. 要解决此错误,请使用 EC2 信任库引用的 CA 证书捆绑包来重新颁发客户端证书。

错误: "ClientCertPurposeInvalid"

出现此错误是因为客户端证书缺少“TLS Web 客户端身份验证”扩展密钥用法 (EKU)。

要解决此错误,请执行以下步骤:

  1. 颁发带有 clientAuth EKU 的新客户端证书,然后重试。

  2. 要进行验证,请运行以下命令:

    openssl x509 -in client-cert.crt --text | grep -A 1 "X509v3 Extended Key Usage:"

    注意: 请将 client-cert.crt 替换为您的证书文件名。

  3. 检查列表中是否包含“TLS Web 客户端身份验证”。

错误: "ClientCertRejected"

出现此错误是因为自定义服务器验证拒绝了客户端证书。

要解决此错误,请执行以下步骤:

  1. 验证应用程序负载均衡器的侦听器是否在“直通”或“验证”模式下使用 mTLS。
    在“直通”模式下,负载均衡器使用 HTTP 标头将客户端证书和证书链发送到目标进行验证。当目标拒绝客户端证书时,您会遇到此错误。
  2. 查看目标上的应用程序日志以确定错误的原因。
  3. 最佳实践是在 mTLS 侦听器上使用“验证”模式而不是“直通”模式。

错误: "ClientCertTypeUnsupported"

发生此错误是因为应用程序负载均衡器不支持客户端提供的证书链中的至少一个证书。该证书使用了不支持的 X509 证书版本、密钥大小、密钥算法或签名算法。

要解决此错误,请执行以下步骤:

  1. 对客户端证书链运行以下命令:

    openssl x509 -in client-cert.crt —text

    注意: 请将 client-cert.crt 替换为您的证书文件名。

  2. 检查证书链中的所有证书是否符合证书要求

错误: "ClientCertUntrusted"

出现此错误是因为客户端证书不可信。

要解决此错误,请执行以下步骤:

  1. 检查 leaf_client_cert_subject 字段中的证书名称是否由配置的 EC2 信任库中的证书颁发机构 (CA) 颁发。
    **注意:**如果客户端证书的颁发者不在 EC2 信任库使用的 CA 证书捆绑包中,则 mTL 将无法生效。

  2. 对客户端证书运行以下命令:

    openssl crl2pkcs7 -nocrl -certfile client-cert.crt | openssl pkcs7 -print_certs -noout | grep -e 'issuer' -e 'subject' | sed -e 's/subject._CN = /Subject: /; s/issuer._CN = /Issuer: /'"

    注意: 请将 client-cert.crt 替换为您的证书文件名。

  3. 要检索捆绑包中存在的主题,请对 EC2 信任库使用的 CA 证书捆绑包运行以下命令:

    openssl crl2pkcs7 -nocrl -certfile client-cert.crt | openssl pkcs7 -print_certs -noout | grep -e 'subject' | sed -e 's/subject.*CN = /Subject: /'

    注意: 请将 client-cert.crt 替换为您的证书捆绑包文件名。

错误: "UnmappedConnectionError"

当无法映射运行时连接时,就会出现此错误。

如需进一步审查,请联系 AWS Support。向 AWS Support 工程师提供以下信息:

  • 以下 curl 命令的输出:

     curl -vvv -X HTTP_action --cert client-cert.crt --key client_key.pem https://alb.fqdn.com -A credstest

    注意: 请将 HTTP_action 替换为您的 HTTP 操作名称,将 client-cert.crt 替换为您的证书文件名,并将 client_key.pem 替换为您的密钥文件名。

  • 客户端证书(不要提供密钥文件)

  • 问题发生时段的连接日志

相关信息

如何使用 Amazon Athena 查询我的应用程序负载均衡器连接日志?

介绍应用程序负载均衡器的 mTLS

如何调查与应用程序负载均衡器上 mTLS 侦听器的 CA 捆绑包相关的问题?