Bluehost - 主机为 Twilio 的 API 调用提供了错误的证书

Bluehost - 主机为 Twilio 的 API 调用提供了错误的证书

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 终端中执行的步骤:

  1. 上传 cacert.pem 文件:首先,将 cacert.pem 文件上传到您的 CentOS VPS。您可以使用 SCP 或 SFTP 等安全文件传输方法进行此操作。

  2. 确定证书存储位置:证书存储的位置可能因您要使用的应用程序而异。对于系统范围的信任,您通常可以将证书放在 /etc/pki/tls/certs/ 中。

  3. 复制证书文件:将 cacert.pem 文件复制到证书存储区: sudo cp cacert.pem /etc/pki/tls/certs/

  4. 更新 CA 证书包:要更新 CA 证书包,请运行以下命令: sudo update-ca-trust enable

  5. 刷新 CA 信任:使用 update-ca-trust extract 命令更新 CA 信任: sudo update-ca-trust extract

  6. 验证证书安装:您可以通过检查 CA 包来验证证书是否已成功安装: cat /etc/pki/tls/certs/ca-bundle.crt 内容cacert.pem应包含在此包中。

  7. 重新启动 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****

相关内容