<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用收到 HTTP 400 - Bad request 响应, “SSL 证书错误”。此错误通常由边缘路由器发送 为 Apigee Edge 的传入连接启用了双向 TLS 设置。
错误消息
客户端应用将获得以下响应代码:
HTTP/1.1 400 Bad Request
后跟以下 HTML 错误页面:
<html> <head> <title>400 The SSL certificate error</title> </head> <body bgcolor="white"> <center> <h1>400 Bad Request</h1> </center> <center>The SSL certificate error</center> <hr> <center>nginx</center> </body> </html>
可能的原因
此问题可能的原因如下:
原因 | 说明 | 适用的问题排查说明 |
客户端证书已过期 | 客户端发送的证书已过期。 | Edge 私有云和公有云用户 |
客户端发送的证书不正确 | 如果客户端应用发送的证书不匹配,则会抛出此错误 (证书存储在 Edge 路由器的信任存储区中)。 | Edge 私有云和公有云用户 |
信任库中缺少客户端根证书 | 如果 Edge 路由器的信任库。 | Edge 私有云和公有云用户 |
客户端证书未在边缘路由器中加载 | 如果上传到信任库的客户端证书未加载,则会抛出此错误 。 | Edge Private Cloud 用户 |
原因:客户端证书已过期
此问题通常发生在双向 TLS 中, 在客户端发送的证书过期时触发。在双向 TLS 中,客户端和服务器都会交换 其公共证书来完成握手。客户端验证服务器证书 服务器会验证客户端证书
在 Edge 中,双向 TLS 在虚拟主机上实现, 其中,服务器证书会添加到密钥库,客户端证书会添加到信任库。
在 TLS 握手期间,如果发现客户端证书已过期, 将发送 400 - 请求错误,以及消息“SSL 证书错误”。
诊断
登录 Edge 界面并查看特定的虚拟主机配置 (管理 > 虚拟主机)为其发出 API 请求 或使用 Get virtual host API 的方法 Management API 来获取特定虚拟主机的定义。
用于双向 TLS 通信的虚拟主机通常如下所示:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>
确定虚拟主机中使用的 Truststore 引用。在上面的示例中, 信任库引用名称为 myTruststoreRef.
- 确定 Truststore 引用所指向的 Truststore。
- 在 Edge 界面中,前往 Admin >环境 >参考文献 然后搜索信任库引用名称。
请记下 Reference 列中特定 Truststore 引用的名称。 这将是您的信任库名称。
<ph type="x-smartling-placeholder">请注意,在上面的示例中,myTruststoreRef 引用了 发送至 myTruststore。因此,信任库名称为 myTruststore。
- 在管理 >环境 >Edge 界面中的 TLS 密钥库中,导航到 TLS 密钥库,并查找在第 3 步中发现的信任库。
选择特定受信任证书存储区(在上文第 3 步中确定)下的证书,如下所示:
<ph type="x-smartling-placeholder">上述示例中别名为
client-cert-markw
的证书表明, 已过期。- 检查信任库的证书别名的证书是否已过期。
- 如果证书未过期,请转到针对其他原因的常见诊断步骤。
分辨率
获取新证书并上传证书:
- 创建一个新的信任库,例如 myNewTruststore。
- 将新证书上传到新创建的信任库。
修改特定虚拟主机中使用的信任方引用,以指向新的 信任库 修改参考文件。
在上述示例中,将引用 myTruststoreRef to myNewTruststore.
其他病因的常见诊断步骤
- 要调查此问题,您需要使用
tcpdump 工具中的命令。
- 如果您是 Private Cloud 用户, 客户端应用或路由器
- 如果您是公有云用户,请在客户端应用上捕获 TCP/IP 数据包。
确定捕获 TCP/IP 数据包的位置后,请使用以下 tcpdump 命令来捕获 TCP/IP 数据包:
tcpdump -i any -s 0 host <IP address> -w <File name>
注意:如果您在路由器上接收 TCP/IP 数据包,请使用
tcpdump
命令中客户端应用的公共 IP 地址。如果您要接收客户端应用上的 TCP/IP 数据包,请使用公共 IP
tcpdump
命令中虚拟主机使用的主机名的地址。参阅 tcpdump 详细了解此工具以及此命令的其他变体。
- 分析使用 Wireshark 工具或您熟悉的类似工具。
下面展示了使用 Wireshark 工具分析 TCP/IP 数据包数据的示例:
- tcpdump 中的数据包 #30(下图)显示客户端应用(源) 发送了一个“Client Hello”将消息发送到路由器(目的地)。
- 数据包 #34 显示路由器确认来自客户端应用的 Client Hello 消息。
- 路由器将“Server Hello”并发送其证书 请求客户端应用在数据包 #38 中发送其证书。
- 在数据包 #38 中,路由器会发送“证书请求”数据包, “标识名”部分,其中提供了有关客户端证书及其链的详细信息 以及路由器(服务器)接受的证书授权中心。 <ph type="x-smartling-placeholder">
客户端应用在数据包 # 41 中发送其证书。查看证书 Verify 部分,确定客户端应用发送的证书。
<ph type="x-smartling-placeholder">- 验证客户端是否发送证书的正文和颁发者及其链 应用(数据包 #41)与接受的来自路由器的证书及其链匹配 (数据包 #38)。如果不匹配,则就是导致此错误的原因。因此,路由器 (服务器)先发送加密警报(数据包 #57),接着发送 FIN、ACK(数据包 58), 客户端应用,最终连接将终止。
- 证书及其链不匹配可能是由 以下部分。
原因:客户端发送的证书不正确
如果证书和/或其证书链的正文/颁发者 客户端应用与路由器(服务器)的信任库中存储的证书和/或其链不匹配。
诊断
登录 Edge 界面并查看特定的虚拟主机配置 (管理 > 虚拟主机)为其发出 API 请求 或使用 Get virtual host API 的方法 Management API 来获取特定虚拟主机的定义。
用于双向 TLS 通信的虚拟主机通常如下所示:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myCompanyTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>
- 确定虚拟主机中使用的 Truststore 引用。
在上面的示例中,信任库引用名称为 myCompanyTruststoreRef。
- 确定 Truststore 引用指向的 Truststore。
- 在 Edge 界面中,前往 Admin >环境引用 然后搜索信任库引用名称。
请记下 Reference 列中特定 Truststore 引用的名称。 这将是您的信任库名称。
<ph type="x-smartling-placeholder">请注意,在上面的示例中,myCompanyTruststoreRef 包含 对 myCompanyTruststore 的引用。因此,信任库名称为 myCompanyTruststore。
- 使用以下 API 获取存储在 Truststore(在上一步确定)中的证书:
<ph type="x-smartling-placeholder">
- </ph>
-
此 API 会列出特定 Truststore 中的所有证书。
-
此 API 会返回有关特定 Truststore 中特定证书的信息。
-
- 检查每个证书的颁发者和主题及其链是否存储在 myCompanyTruststore 与证书及其链的相应信息匹配, 如上述 TCP/IP 数据包(参见数据包 #38)所示。如果存在不匹配,则表示 确保上传到信任库的证书未在边缘路由器中加载。 移至原因:客户端证书未加载到边缘路由器。
- 如果在第 5 步中未发现不匹配的情况,则表示客户端应用 不会发送正确的证书及其链。
分辨率
确保客户端应用将正确的证书及其链发送到 Edge。
原因:信任存储区中缺少客户端根证书
如果 Edge 路由器的信任库。
诊断
登录 Edge 界面并查看该 API 为其预配的特定虚拟主机配置 (Admin > Virtual Hosts > virtual_host), 或使用 获取虚拟主机 API 以获取特定虚拟主机的定义。
用于双向 TLS 通信的虚拟主机通常如下所示:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myCompanyTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>
- 确定虚拟主机中使用的信任库引用。在前面的示例中, 信任库引用名称为 myCompanyTruststoreRef.
- 确定信任库引用所使用的实际信任库。
- 在 Edge 界面中,前往 Admin >环境 >参考和搜索 。
特定信任库引用的信任库名称位于 参考列。
<ph type="x-smartling-placeholder">在此示例中,请注意 myCompanyTruststoreRef 包含 myCompanyTruststore(在“参考”列中)。因此,信任库 名称为 myCompanyTruststore。
- 使用以下命令获取存储在信任库中的证书(在上一步确定)
以下 API:
<ph type="x-smartling-placeholder">
- </ph>
- <ph type="x-smartling-placeholder"></ph> 列出密钥库或信任库 API 的证书。此 API 列出了 证书数量。
- <ph type="x-smartling-placeholder"></ph> 通过密钥库或信任库 API 获取证书详情。此 API 会返回有关 信任存储区中的特定证书。
检查证书是否包含完整的链(包括根证书) 如 TCP/IP 数据包中所示(参见图 4)。信任库 必须包含根证书以及客户端的叶证书(或叶证书),并且 中间证书如果信任存储区中缺少客户端的有效根证书, 这就是导致错误的原因。
不过,如果客户端的完整证书链(包括根证书) 则表示上传到 信任库可能未加载到边缘路由器。如果是这种情况,请参阅 原因:客户端证书未加载到边缘路由器。
分辨率
确保正确的客户端证书(包括根证书)可用 位于 Apigee Edge 路由器的信任库中。
原因:客户端证书未在边缘路由器中加载
- 如果您是公有云用户,请与 Apigee Edge 支持团队联系。
- 如果您是 Private Cloud 用户,请在每个路由器上按照以下说明操作:
<ph type="x-smartling-placeholder">
- </ph>
- 检查文件
/opt/nginx/conf.d/OrgName_envName_vhostName-client.pem
是否存在 特定虚拟主机的节点。如果该文件不存在,请转到 解决方法部分。 - 如果该文件已存在,请使用以下
openssl
命令获取该文件的详细信息 证书:openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
- 检查证书的颁发者、主题和过期日期。如果其中任何一项都不相符 或者使用管理 API, 出错的原因。
- 路由器可能未重新加载上传的证书。
- 检查文件
分辨率
重启路由器,确保通过以下步骤加载最新的证书:
apigee-service edge-router restart
重新运行 API 并检查结果。如果问题仍然存在,请转到 收集诊断信息。
收集诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下诊断信息。 与 Apigee Edge 支持团队联系并分享您收集的信息:
- 如果您是公有云用户,请提供以下信息:
<ph type="x-smartling-placeholder">
- </ph>
- 组织名称
- 环境名称
- API 代理名称
- 虚拟主机名
- 主机别名
- 完整 curl 命令以重现该错误
- 在客户端应用上捕获的 TCP/IP 数据包
- 如果您是 Private Cloud 用户,请提供以下信息:
<ph type="x-smartling-placeholder">
- </ph>
- 虚拟主机名及其定义(使用 Get virtual host API)
- 主机别名
- 观察到完整的错误消息
- 在客户端应用或路由器上捕获的 TCP/IP 数据包。
- 列出来自 Keystore API 的证书的输出 API 以及使用 Get cert details API 获取的每个证书的详细信息。
- 详细说明您在本手册中的哪些部分尝试过,以及其他任何能够 帮助我们快速解决此问题。