如何排查启用了自定义域和双向 TLS 的 Amazon API Gateway 的证书链和自签名证书问题?

上次更新日期:2022 年 11 月 1 日

我正在将双向传输层安全性协议(TLS)身份验证用于具有自定义域名的 Amazon API Gateway。我遇到了证书链或自签名证书错误。如何排查此问题?

简短描述

在开始之前,确保满足下列条件:

解决方法

要获取调用 Amazon API Gateway API 时的特定错误消息列表,请运行类似以下内容的 curl 命令:

$ curl -v https://mtls.example.info/test-apigw-mtls --key self-signed.key --cert self-signed.pem:"example"

客户端错误

“curl:(58) 无法加载 PEM 客户端证书,OpenSSL 错误错误:02001002:系统库:fopen:没有此类文件或目录,(未找到密钥、密码短语错误,或文件格式错误?”

此错误表示 PEM 文件的名称、位置或文件格式错误。例如,存储在本地的证书文件格式为 .crt,但在 API 请求中改用了 .pem 文件。要解决此问题,请确保本地客户端证书的格式和名称正确。

“curl:(6) 无法解析主机:mtls.example.info”

客户端无法解析域名。请确保域名和配置正确。

“url:(58) schannel:无法导入证书文件 self-signed.pem,最后一个错误是 0x80092002”

此错误表示本地客户端 .pem 文件存在问题。请确保 .pem 文件包含正确的名称和格式。

“curl:(58) 无法设置私钥文件:‘self-signed.key’类型 PEM”

此错误表示本地客户端文件存在问题。请确保 HTTP 请求中提供的私钥没有丢失且正确。

服务器错误

“访问被拒绝。原因:自签名证书。”

验证并确保 API 请求中的自签名客户端证书未被更改或损坏。

以下内容必须完全匹配:

  • 用于签署 Amazon S3 中信任库内自签名证书(bundle.crtbundle.pem)的私有密钥 (private.key) 的模数。
  • API 请求中传递的客户端证书 (client.crt) 的模数。

要比较两个模数,请运行以下 OpenSSL 命令:

$ openssl rsa -noout -modulus -in private.key
$ openssl x509 -noout -modulus -in bundle.crt
$ openssl x509 -noout -modulus -in client.crt

注意:要生成较短的哈希值以便于比较,您可以使用 PIPE 将输出模数发送到加密哈希函数中。例如:openssl sha1

$ openssl [operation] -noout -modulus -in [data] | openssl sha1

有效命令输出示例:

2143831a73a8bb28467860df18550c696c03fbcb
2143831a73a8bb28467860df18550c696c03fbcb
2143831a73a8bb28467860df18550c696c03fbcb

要确认数据完整性,请运行以下 diff 命令,验证并确保内容级别没有任何数据修改:

$ diff client.crt bundle.crt