![Bluehost - 主机为 Twilio 的 API 调用提供了错误的证书](https://linux22.com/image/790334/Bluehost%20-%20%E4%B8%BB%E6%9C%BA%E4%B8%BA%20Twilio%20%E7%9A%84%20API%20%E8%B0%83%E7%94%A8%E6%8F%90%E4%BE%9B%E4%BA%86%E9%94%99%E8%AF%AF%E7%9A%84%E8%AF%81%E4%B9%A6.png)
Bluehost VPS运行 CentOS,但cat /etc/redhat-release
揭示了CloudLinux release 6.10 (Final)
。
在我的本地 PC (Win11/IIS/PHP) 上针对 Twilio API 执行 curl 命令工作正常。当我在 Bluehost 服务器(启用了详细输出)上尝试执行相同操作时,它会失败并显示以下消息:
证书主题名称“*.us-east-1.es.amazonaws.com”与目标主机名“api.twilio.com”不匹配
* About to connect() to api.twilio.com port 443 (#0)
* Trying 50.19.189.95... connected
* Connected to api.twilio.com (50.19.189.95) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL: certificate subject name '*.us-east-1.es.amazonaws.com' does not match target host name 'api.twilio.com'
* NSS error -12276
* Closing connection #0
curl: (51) SSL: certificate subject name '*.us-east-1.es.amazonaws.com' does not match target host name 'api.twilio.com'
Twilio 支持人员指示我通过 Chrome 下载他们的 SSL 证书,我照做了。我将证书命名为“cacert.pem”,以为这就是它需要的名称,但我不知道。以下是他们让我在 bash 终端中执行的步骤:
上传 cacert.pem 文件:首先,将 cacert.pem 文件上传到您的 CentOS VPS。您可以使用 SCP 或 SFTP 等安全文件传输方法进行此操作。
确定证书存储位置:证书存储的位置可能因您要使用的应用程序而异。对于系统范围的信任,您通常可以将证书放在 /etc/pki/tls/certs/ 中。
复制证书文件:将 cacert.pem 文件复制到证书存储区:
sudo cp cacert.pem /etc/pki/tls/certs/
更新 CA 证书包:要更新 CA 证书包,请运行以下命令:
sudo update-ca-trust enable
刷新 CA 信任:使用 update-ca-trust extract 命令更新 CA 信任:
sudo update-ca-trust extract
验证证书安装:您可以通过检查 CA 包来验证证书是否已成功安装:
cat /etc/pki/tls/certs/ca-bundle.crt
内容cacert.pem
应包含在此包中。重新启动 Apache。
这些都没有什么区别,仍然出示错误的证书。
我问他们“操作系统如何知道要使用哪个证书?”但他们没有回应。似乎从未指定过这一点。
我对 Twilio API 运行了一个 curl 命令(注意,我使用-k
不安全的命令只是为了看看会发生什么),并出现了以下错误:
授权标头需要“Credential”参数。授权标头需要“Signature”参数。授权标头需要“SignedHeaders”参数。授权标头需要存在“X-Amz-Date”或“Date”标头。Authorization=Basic QUNmN***
dig
我在 Bluehost 服务器上运行了以下 2 个诊断程序:
dig api.twilio.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.8 <<>> api.twilio.com ;; 全局选项:+cmd ;; 得到答案: ;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:58818 ;; 标志:qr rd ra;查询:1,答案:9,权威:0,附加:0
;; 问题部分:;api.twilio.com。在
;; 答案部分: api.twilio.com。20 IN CNAME
virginia.us1.api-lb.twilio.com。virginia.us1.api-lb.twilio.com。20 IN CNAME self-healing.api-alb.us1.api-lb.twilio.com。self-healing.api-alb.us1.api-lb.twilio.com。20 IN CNAME ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。 20 在 34.204.146.75 ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。20 在 52.20.98.48 ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。20 在 35.153.214.247 ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。20 在 54.208.14.118 ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。 20 在 54.242.5.138 ien-alb-bapi-b-156106065.us-east-1.elb.amazonaws.com。20 在 34.232.251.189;; 查询时间:10 毫秒 ;; 服务器:1.1.1.1#53(1.1.1.1) ;; 时间:2023 年 11 月 3 日星期五 08:51:38 ;; 收到的消息大小:260
dig api.twilio.com @8.8.8.8
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.8 <<>> api.twilio.com @8.8.8.8 ;; 全局选项:+cmd ;; 得到答案: ;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:58143 ;; 标志:qr rd ra;查询:1,答案:9,权威:0,附加:0
;; 问题部分:;api.twilio.com。在
;; 答案部分:api.twilio.com。21 IN CNAME
virginia.us1.api-lb.twilio.com。virginia.us1.api-lb.twilio.com。21 IN CNAME self-healing.api-alb.us1.api-lb.twilio.com。self-healing.api-alb.us1.api-lb.twilio.com。21 IN CNAME ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。 21 在 A 3.222.47.158 ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。21 在 A 34.236.63.82 ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。21 在 A 52.0.177.50 ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。21 在 A 34.232.27.126 ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。 21 在 A 3.225.164.19 ien-alb-bapi-a-1963256146.us-east-1.elb.amazonaws.com。21 在 A 52.206.184.52;; 查询时间:23 毫秒 ;; 服务器:8.8.8.8#53(8.8.8.8) ;; 时间:2023 年 11 月 3 日星期五 08:52:11 ;; 收到的消息大小:261
根据 Turdie 的建议,我于 11 月 4 日尝试了以下操作:
curl -v --tlsv1.2 -X POST "https://api.twilio.com/2010-04-01/Accounts/ACf7b58ec793***4d/Messages.json" \
> --data-urlencode "Body=This is the ship that made the Kessel Run in fourteen parsecs?" \
> --data-urlencode "From=+14*****40" \
> --data-urlencode "To=+18*****44" \
> -u ACf7b*****30a4d:0ce7445d*****48bc4d
结果:
- 即将连接()api.twilio.com 端口 443 (#0)
- 尝试 50.19.189.95...超时
- 尝试 35.168.202.10...超时
- 尝试 54.173.225.186...超时
- 尝试 107.22.7.7...超时
- 正在尝试 52.204.229.116... 已连接
- 已连接到 api.twilio.com (52.204.229.116) 端口 443 (#0)
- 使用 certpath 初始化 NSS:sql:/etc/pki/nssdb
- CAfile:/etc/pki/tls/certs/ca-bundle.crt CApath:无
- SSL:证书主题名称“*.glympse.com”与目标主机名“api.twilio.com”不匹配
- NSS 错误 -12276
- 关闭连接 #0 curl:(51)SSL:证书主题名称“*.glympse.com”与目标主机名“api.twilio.com”不匹配
根据 Turdie 的建议,我还在 11 月 4 日尝试了以下操作:
openssl s_client -connect api.twilio.com
结果:
没有定义端口
(之后它会吐出大量可用的参数,比如文档。不确定您是否想要。)
我是一名开发人员,但对 Linux 和证书还是新手,所以我希望有人能帮助我。提前致谢。
答案1
根据我的研究,这是 curl 的问题。
你需要使用
curl -v --tlsv1.2
这看起来和 TS 遇到的问题类似
https://blog.michaelfmcnamara.com/2015/12/curl-and-ssl-tls-issues/
在您的 curl 中,您似乎正在使用 glympse.com NSS 发送证书,证书路径为:sql:/etc/pki/nssdb。这会导致不匹配,因为 twilio.com 和 glympse 是不同的名称。我认为您需要向 twilio.com 查询您需要使用哪个证书来连接到 api。您似乎还使用了 nssdb 和 sql 数据库,我对此一无所知。
curl 中的最后一行明确指出了证书不匹配
Closing connection #0 curl: (51) SSL: certificate subject name '*.glympse.com' does not match target host name 'api.twilio.com'
编辑
你的 api 密钥在哪里?查看文档
curl -v --tlsv1.2 -X POST "https://api.twilio.com/2010-04-01/Accounts/ACf7b58ec793***4d/Messages.json" \
> --data-urlencode "Body=This is the ship that made the Kessel Run in fourteen parsecs?" \
> --data-urlencode "From=+14*****40" \
> --data-urlencode "To=+18*****44" \
> -u ACf7b*****30a4d:0ce7445d****