【问题标题】:SSL errors using MailChimp's API使用 MailChimp 的 API 的 SSL 错误
【发布时间】:2014-05-23 07:31:23
【问题描述】:

我正在尝试连接 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 文件,但这给出了上面列出的“not OK”错误。

我还尝试使用我们主机提供的信息(一个文本文件,将扩展名更改为 .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

并通过 composer 获取 Vendor 文件:

"require": {
    "mailchimp/mailchimp": ">=2.0.0"
},

【问题讨论】:

  • 我不确定您的设置出了什么问题,我刚刚安装了示例代码,通过 composer 获取了供应商文件: curl -sS getcomposer.org/installer | php -d detect_unicode=Off 并运行 php composer.phar 安装。这很好用,经过一番 apache 摆弄后,我可以将新用户添加到 mailchimp 列表中。您使用的是什么操作系统?
  • @BenHitchcock - Linux
  • 1.我忍不住注意到您发布此消息的日期是关于 Heartbleed 更新正在广播的时间——这可能是相关的吗? 2. 您是否尝试过在同一设置中向另一方发出类似的 SSL 请求?
  • Seth,这也是我的想法,但是 Dave 使用的示例代码在我的机器上运行良好。戴夫,我刚刚将它安装在运行 10.8 的 Mac 上。我不禁想到您的服务器上有一些时髦的东西,请参阅下面的答案。还可以尝试将其安装在不同的服务器上,看看是否可行。

标签: ssl mailchimp


【解决方案1】:

在与 MailChimp 交谈后,他们告诉我,出于兼容性原因,他们仍在使用的证书(2016 年 1 月)是 GTE Cyber​​Trust 全球根(注意 GTE 已被 Digicert 收购),所以你不需要替换整个包,只需添加或强制 PHP 读取此证书:

https://gte-cybertrust-global-root.digicert.com/info/index.html

(请注意,如果您尝试在 Firefox 中加载它,您将收到“不安全连接”警告,原因很明显 - 您可以添加一个例外。)

它是标准的 .crt 格式,这是您需要的。 Guide to certificate formats

您没有指定服务器是什么,但这里是如何在 Linux 上添加额外的服务器而无需替换整个捆绑包等:

在 Debian/Ubuntu 上,证书位于 /etc/ssl/certs/

  1. 将签名复制并粘贴到该目录下的新文件中,例如mailchimp-legacy.crt
  2. run sudo c_rehash /etc/ssl/certs - 这里发生了什么: c_rehash 计算每个证书的简短哈希,并创建一个符号链接,从它到原始 .pem 或 .crt 文件。基本上,它是一个用于 openssl 的快速查找表 - openssl 也会执行哈希并查找符号链接,而不必拥有证书名称数据库或依次打开每个文件以找到正确的文件。
  3. 检查它是否与此一起使用: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 下并运行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 Root Resource 并附加 ?fields=account_name

有人在 cmets 中询问这是否与 Heartbleed 有关。不是。Heartbleed 是一个与窃听 RAM 中的数据有关的 openssl 漏洞。 Mozilla removed GTE CyberTrust(两次)因为他们想要 remove all 1024-bit root certificates - 研究表明,一个民族国家可以打破 1024 位素数。

【讨论】:

  • 几天前更新了 Debian Jessie,在尝试将用户添加到 MailChimp 时遇到了这个错误cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)。接下来为我解决了这个问题。
  • 有没有办法在 OSX 上临时完成此任务而不影响安全性?
  • 谢谢,尝试了几次以在 Debian + php 5.6 设置上解决此问题,并且成功了。
【解决方案2】:

您需要较旧的证书:

https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

按照页面上的定义:

http://curl.haxx.se/docs/caextract.html

RSA-1024 已移除

猜测 Mandrill 和 Mailchimp 使用 RSA-1024 版本。

那是你需要的。我有同样的问题。

【讨论】:

  • 这也适用于 Microsoft 的 Live Connect oAuth。谢谢!
【解决方案3】:

Debian 和其他操作系统和浏览器已删除 1024 位证书,因为它们不再被认为是安全的。但是 Mailchimp 还没有切换到更高安全性的证书。因此,您必须手动将旧证书重新添加到您的系统中。

debian上,正确的解决方案是按照Alternative chain verification failure after 1024b root CAs removal中的说明进行操作:

  1. 首先,转到 GTE CyberTrust Global Root 并复制 Certificate: 部分(包括 -----BEGIN CERTIFICATE----------END CERTIFICATE-----。将其粘贴到文件中 /usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt 使用此命令:cat > /usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt

  2. 使用命令检查是否正常:openssl x509 -in /usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt -text -noout

  3. 要启用该证书,请将此行添加到/etc/ca-certificates.confmozilla/GTE_CyberTrust_Global_Root.crt

  4. 更新 debian 的证书:update-ca-certificates

【讨论】:

  • 老兄,谢谢!这解决了我的星巴克 wifi 问题。我是否还建议使用以下代码编辑步骤 1 以简化过程(来自:stackoverflow.com/a/7886248/6924364echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/share/ca-certificates/mozilla/GTE_CyberTrust_Global_Root.crt
【解决方案4】:

在您的 AppController 中,当您创建一个新的 Mailchimp 实例时,您实际上可以传递以下选项:

'ssl_verifypeer'

'ssl_verifyhost'

'ssl_cainfo'

当 Mailchimp 请求数据时,这些会映射到 Curl。

首先,我会尝试修改 AppController 的第 44 行,使其看起来像这样:

       $this->mc = new Mailchimp('yourAPIKey', array('ssl_verifypeer' => false)); //your api key here

这将允许您验证导致问题的是对等证书。当然,我不建议您将此视为有效的生产解决方案,这只是一个故障排除步骤。

【讨论】:

  • 这样做可行(当然),但首先违背了使用 SSL 的目的(根据提供该建议的网站过多):(
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 2018-03-18
  • 2014-03-22
  • 2022-07-05
  • 2015-12-14
  • 2018-08-22
  • 2018-10-25
  • 2014-04-18
相关资源
最近更新 更多