使用MailChimp API的SSL错误
我正在尝试使用MailChimp的API连接,但不断收到错误:
错误。 API调用列表/列表失败:SSL对等证书或SSH远程密钥不正确
然后,我创建了一个cacert.pem文件并将其设置在Mailchimp.php文件中:
$this->ssl_cainfo = ROOT . DS . 'cacert.pem';
得到这个:
错误。 调用列表/列表API失败:SSL证书问题,请验证CA证书是否正确。 详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
要么
错误。 API调用列表/列表失败:SSL对等证书或SSH远程密钥不正确
按此页面:
我尝试使用http://curl.haxx.se/docs/caextract.html文件作为我的cacert.pem文件,但这给出了上面列出的“不好”错误。
我也尝试用我们的主机提供的信息(一个文本文件,将扩展名改为.pem,并将一个和/或两个数据块粘贴到它中,使其看起来像这样):
-----BEGIN CERTIFICATE-----
adjkflsdjflkasjdflkajdflksdflsdfkj
asldfkjaadsfhjkfhdsajkfhakjdhfkjdh
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
adjkflsdjflkasjdflkajdflksdflsdfkj
asldfkjaadsfhjkfhdsajkfhakjdhfkjdh
....
-----END CERTIFICATE-----
或者只有一个:
-----BEGIN CERTIFICATE-----
adjkflsdjflkasjdflkajdflksdflsdfkj
asldfkjaadsfhjkfhdsajkfhakjdhfkjdh
....
-----END CERTIFICATE-----
不知道该从哪里开始,要尝试什么......等等
使用这里的示例代码:https://github.com/mailchimp/mcapi2-php-examples
通过作曲家获取供应商文件:
"require": {
"mailchimp/mailchimp": ">=2.0.0"
},
与MailChimp通话后,他们仍然使用的证书(2016年1月) - 出于兼容性原因,他们告诉我 - 是GTE CyberTrust Global Root (注意GTE是由Digicert购买的),因此您无需更换整个捆绑,只需添加或强制PHP读取此证书:
https://gte-cybertrust-global-root.digicert.com/info/index.html
(注意,如果您尝试在Firefox中加载该警告,并且希望显而易见的原因,您会收到'不安全的连接'警告 - 您可以添加例外。)
它是标准的.crt格式,这是你需要的。 证书格式指南
你没有指定服务器是什么,但是下面是如何在Linux上添加额外的一个,而不必替换整个bundle等:
在Debian / Ubuntu上,证书位于/etc/ssl/certs/
mailchimp-legacy.crt
sudo c_rehash /etc/ssl/certs
- 这里是怎么回事: c_rehash
计算每个证书的短散列并创建一个从那个到原始.pem或.crt文件的符号链接。 基本上它是一个openssl的快速查找表 - openssl也将执行哈希以及查找符号链接,而不必拥有证书名称的数据库,或者依次打开每个文件以找到合适的名称。 ls -lh *.0 | grep 'mailchimp-legacy.crt'
ls -lh *.0 | grep 'mailchimp-legacy.crt'
你应该看到这样的东西:
lrwxrwxrwx 1 root root 20 Feb 13 14:17 4d654d1d.0 -> mailchimp-legacy.crt
lrwxrwxrwx 1 root root 20 Feb 13 14:17 c692a373.0 -> mailchimp-legacy.crt
或者:在Debian上,还有一个名为/etc/ca-certificates.conf
的文件,并且该行中有感叹号!mozilla/GTE_CyberTrust_Global_Root.crt
表示不使用该文件。 我相信可以在/usr/share/ca-certificates/mozilla
下放一份这个名字/usr/share/ca-certificates/mozilla
并运行sudo update-ca-certificates
,但是在我看来它很可能会在包&配置文件下次更新。
请记住删除您正在使用的任何解决方法 - 例如 - 您的证书目录中的旧CA束 - 在您的PHP中覆盖CURLOPT_CAINFO的任何位置 - php.ini中的openssl.cainfo行
检查您的应用程序是否正常工 我不需要重新启动PHP或我的网络服务器,所做的更改是即时的。 值得使用apt-get update/upgrade
来检查你是否拥有最近的证书包。
以下是通过命令行验证SSL连接(以及验证)到特定服务器的方法:
echo GET | openssl s_client -CApath /etc/ssl/certs/ -connect us3.api.mailchimp.com:443 2>&1
监控:(已更新)MailChimp的v2.0 API(不建议使用)有一个名为' helper/ping
'的端点,它返回一些文本以指示API状态 - 可用作API健康状况的自动测试,并且您的证书仍能正常工作。 如果您使用的是v3.0,那么他们建议使用API根资源,如果您实际上不需要检查任何数据,请添加?fields=account_name
。
有人在评论中询问这是否与Heartbleed有关。 No Heartbleed是一个openssl漏洞,涉及窃听RAM中的数据。 Mozilla删除了GTE CyberTrust(两次),因为他们想要删除所有1024位的根证书 - 研究表明,一个国家的状态可能会破坏一个1024位的素数。
您需要较旧的证书:
https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt
正如页面上所定义的那样:
http://curl.haxx.se/docs/caextract.html
删除了RSA-1024
Guess Mandrill Mailchimp使用RSA-1024版本。
这是你需要的。 我遇到过同样的问题。
Debian和其他操作系统和浏览器已经删除了1024位证书,因为它们不再被认为是安全的。 但是Mailchimp尚未切换到更高安全性的证书。 因此,您将不得不手动将旧证书添加到您的系统。
在debian上 ,正确的解决方案是在1024b根CAs删除后按照替代链验证失败中的说明操作:
首先,转到GTE CyberTrust Global Root并复制证书:部分(包括-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
。将其粘贴到文件/usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt
使用以下命令/usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt
: cat > /usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt
。
使用以下命令检查它是否正确: openssl x509 -in /usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt -text -noout
要启用该证书,请将此行添加到/etc/ca-certificates.conf
: mozilla/GTE_CyberTrust_Global_Root.crt
更新debian的证书: update-ca-certificates