CURL SSL 无法在 IIS 上使用 PHP 5.6 获取本地颁发者证书 Mailchimp

CURL SSL unable to get local issuer certificate Mailchimp with PHP 5.6 on IIS

我正在尝试使用他们提供的 Mailchimp API Wrapper。它使用 PHP Curl 扩展,在我的开发环境(PHP、Apache 和 Ubuntu)上一切正常。

现在我正试图让它在实时环境中工作,即 IIS 7.5 上的 PHP 5.6.7。 phpinfo 告诉我我正在使用 CURL 7.40.0。无论我做什么,我都会收到同样的错误 SSL certificate problem: unable to get local issuer certificate

我浏览了很多类似的问题,试图找到答案。一个常见的主题是下载 CA Bundle(我尝试了 curl.haxx.se 的 HTTP 和 github 版本的 HTTPS),然后修改代码以包含

curl_setopt($ch, CURLOPT_CAINFO, "C:\path\to\cacert.pem");

或者我的首选选项是添加到 php.ini 文件

curl.cainfo="C:\path\to\cacert.pem"

但这些都没有解决问题。我也试过

ini_set('openssl.cafile', '\path\to\cacert'); 

按照建议here,这也行不通。

我想知道问题是否出在文件权限上(所以我一直在为每个人提供 cacert.pem 的读取权限以消除这种可能性),或者问题是否与需要转义有关PHP 中的 \ 字符(所以我尝试了 c:\path\to\cacert.pem 和 c:\path\to\cacert.pem 变体)但无论我做什么我都没有找到任何使其工作的组合,除了将 CURLOPT_SSL_VERIFYPEER 设置为 false ,我显然不想这样做。

我想知道这是否与 中的问题相同,主要区别在于我使用的是 IIS 而不是 XAMPP。

有什么我遗漏的吗?为什么这个设置不起作用?

提前感谢您的任何建议。

MailChimp 当前仍在使用的证书(他们告诉我出于兼容性原因)是 GTE Cyber​​Trust Global Root(注意 GTE 已被 Digicert 收购),因此您不需要需要替换整个包,只需添加或强制 PHP 读取此证书:

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

很遗憾,我只使用 Linux,所以我无法为您提供有关 IIS 的任何帮助。

此线程对于我在尝试使用 Windows Azure 通过 Mailchimp API 进行通信时遇到的类似问题非常有用。我终于通过以下步骤让它工作:

1。下载修改cacert.pem

我已经从 https://curl.haxx.se/ca/cacert.pem 下载了 cacert.pem。这对我也不起作用。此证书不包含正确的 GTE Cyber​​trust Global Root 信息,因此我将其粘贴到:

-----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE-----

2。上传证书

例如in "D:\home\site\cacert.pem" - 只要你记得路径

3。更改 curl.cainfo

的系统配置设置

此信息来自 Microsoft 的文档:

  1. Add an App Setting to your Web App with the key PHP_INI_SCAN_DIR and value d:\home\site\ini

  2. Create an settings.ini file using Kudu Console (http://[site-name].scm.azurewebsite.net) in the d:\home\site\ini directory.

  3. Add configuration settings to the settings.ini file using the same syntax you would use in a php.ini file.

这里我们加上:curl.cainfo = "D:\home\site\cacert.pem"

  1. Restart your Web App to load the changes.

您可以使用 phpinfo() 检查您的自定义 .ini 文件是否被提取 - 它应该显示在 "Additional .ini files parsed"

这就是它在 Windows Azure 上为我工作的原因!

(请注意,由于缺乏声誉,我不能粘贴超过 2 个链接,我刚刚注册)