你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

排查应用程序网关中的相互身份验证错误

了解如何排查使用应用程序网关时相互身份验证的问题。

概述

对于应用程序网关上的相互身份验证,配置后客户端证书验证期间可能会出现各种错误。 这些错误的常见原因包括:

  • 在没有根 CA 证书的情况下上传证书或证书链
  • 上传具有多个根 CA 证书的证书链
  • 上传仅包含叶证书而不含 CA 证书的证书链
  • 由于颁发者可分辨名称 (DN) 不匹配导致的证书验证错误
  • 缺少或不正确的扩展密钥用法 (EKU) 属性

本指南介绍可能会遇到的不同方案,并为每个方案提供故障排除步骤。 我们还解决了特定的错误代码,并解释了它们在相互身份验证方案中的可能原因。 所有客户端证书身份验证失败都会导致 HTTP 400(请求错误)状态代码返回到客户端。

方案故障排除 - 配置问题

以下方案解决了设置相互身份验证时可能发生的常见配置问题。 每个方案都包含问题说明和建议的解决方案。

自签名证书

问题

上传的客户端证书是自签名证书,导致出现错误代码 ApplicationGatewayTrustedClientCertificateDoesNotContainAnyCACertificate。

解决方案

验证所使用的自签名证书是否包括值为“2.5.29.19”的 BasicConstraintsOid 扩展,并将 CA 标志设置为 TRUE。 此扩展指示证书使用者可以充当证书颁发机构。

若要检查证书属性,可以使用以下 OpenSSL 命令:

openssl x509 -in certificate.pem -text -noout

在输出中查找“基本约束”部分,其中应显示有效 CA 证书的“CA:TRUE”。 有关生成自签名客户端证书的详细指南,请参阅 受信任的客户端证书

方案故障排除 - 连接问题

你也许能够顺利配置双向身份验证,但在向应用程序网关发送请求时遇到了问题。 以下部分介绍了一些常见问题和解决方案。 可以在应用程序网关的访问日志中找到 sslClientVerify 属性。

SslClientVerify 为 NONE

问题

sslClientVerify 属性在访问日志中显示为“NONE”,指示 TLS 握手期间未显示任何客户端证书。

解决方案

当客户端未将 TLS 握手请求中的客户端证书发送到应用程序网关时,会出现此问题。 在以下情况下,可能会出现此问题:

  • 客户端应用程序未配置为使用客户端证书
  • 客户端证书未正确安装或可访问
  • 客户端不信任应用程序网关的服务器证书

若要验证是否已在应用程序网关上正确配置客户端身份验证,请使用以下 OpenSSL 命令:

openssl s_client -connect <hostname:port> -cert <path-to-certificate> -key <client-private-key-file> 

地点:

  • -cert 指定客户端证书的路径(叶证书)
  • -key 指定客户端私钥文件的路径
  • -verify_return_error 确保命令在证书验证失败时失败

有关使用 OpenSSL s_client 命令的详细信息,请参阅 OpenSSL 手册页

SslClientVerify 失败

问题

sslClientVerify 属性在访问日志中显示为“FAILED”,指示客户端证书验证在 TLS 握手期间失败。

解决方案

访问日志中存在许多失败的潜在原因。 下面是失败的常见原因列表:

  • 无法获取颁发者证书: 找不到客户端证书的颁发者证书。 此问题通常意味着受信任的客户端 CA 证书链未在应用程序网关上完成。 验证在应用程序网关上上传的受信任客户端 CA 证书链是否已完成。
  • 无法获取本地颁发者证书: 与无法获取颁发者证书类似,找不到客户端证书的颁发者证书。 此问题通常意味着受信任的客户端 CA 证书链未在应用程序网关上完成。 验证在应用程序网关上上传的受信任客户端 CA 证书链是否已完成。
  • 无法验证第一个证书: 无法验证客户端证书。 具体而言,当客户端仅提供颁发者不受信任的叶证书时,就会发生此错误。 验证在应用程序网关上上传的受信任客户端 CA 证书链是否已完成。
  • 无法验证客户端证书颁发者:配置 VerifyClientCertIssuerDN 设置为 true 时,会发生此错误。 当客户端证书的颁发者 DN 与从客户上传的受信任客户端 CA 证书链中提取的 ClientCertificateIssuerDN 不匹配时,通常会发生此错误。 有关应用程序网关如何提取 ClientCertificateIssuerDN 的详细信息,请查看应用程序网关提取颁发者 DN。 最佳做法是确保将每个文件一个证书链上传到应用程序网关。
  • 不支持的证书用途: 确保客户端证书指定客户端身份验证的扩展密钥用法(1.3.6.1.5.5.7.3.2)。 有关客户端身份验证的扩展密钥用法和对象标识符定义的更多详细信息,请参阅 RFC 3280RFC 5280

有关如何提取要上传到应用程序网关的整个受信任客户端 CA 证书链的详细信息,请参阅如何提取受信任客户端 CA 证书链

错误代码故障排除

配置相互身份验证时,将显示以下错误代码。 每个错误都包含可能的原因和建议的解决方案。

错误代码:ApplicationGatewayTrustedClientCertificateMustSpecifyData

原因

上传的证书文件缺少证书数据,或者包含一个没有有效证书内容的空文件。

解决方案

验证证书文件是否包含格式正确的有效证书数据(PEM)。 使用文本编辑器确认文件包含分隔符之间的-----BEGIN CERTIFICATE----------END CERTIFICATE-----证书内容。

错误代码:ApplicationGatewayTrustedClientCertificateMustNotHavePrivateKey

原因

证书链中有一个私钥。 证书链中不应有私钥。

解决方案

仔细检查已上传的证书链,并删除属于链的私钥。 在没有私钥的情况下重新加载链。

错误代码:ApplicationGatewayTrustedClientCertificateInvalidData

原因

此错误有两个可能的原因:

  • 分析失败: 证书链的格式不正确。 应用程序网关需要采用 PEM 格式的证书链,且具有正确分隔的单个证书。
  • 空内容: 上传的文件仅包含没有实际证书数据的分隔符。

解决方案

根据具体原因,应用以下解决方案之一:

  • 格式问题:确保证书链采用 PEM 格式,每个证书都由 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 标记正确分隔。 每个证书应位于这些分隔符内的单独行中。
  • 缺少数据: 验证证书文件是否包含分隔符之间的实际证书数据,而不仅仅是空分隔符。

错误代码:ApplicationGatewayTrustedClientCertificateDoesNotContainAnyCACertificate

原因

上传的证书仅包含叶证书,没有 CA 证书。 上传包含 CA 证书和叶证书的证书链是可接受的,因为叶证书会直接被忽略,但证书必须具有 CA。

解决方案

确保证书链至少包含一个具有正确 BasicConstraintsOid 扩展(OID: 2.5.29.19)的 CA 证书,其中 CA 标志设置为 TRUE。 此扩展指示证书使用者可以充当证书颁发机构。

若要验证证书的 CA 状态,请使用:

openssl x509 -in certificate.pem -text -noout | grep -A 2 "Basic Constraints"

输出应显示为“CA:TRUE”以标示有效的 CA 证书。

错误代码:ApplicationGatewayOnlyOneRootCAAllowedInTrustedClientCertificate(应用程序网关在受信任的客户端证书中只允许一个根CA)

原因

证书链包含多个根 CA 证书 包含零根 CA 证书。

解决方案

上传的证书必须正好包含一个根 CA 证书(中间 CA 证书可以根据需要包含任意数量)。