我正在将双向传输层安全性协议(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.crt 或 bundle.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
相关信息
为 Amazon API Gateway 引入双向 TLS 身份验证
如何排查来自需要双向 TLS 的 API Gateway 自定义域名的 HTTP 403 禁止访问错误?