首页 文章

Paypal访问 - SSL证书:无法获得本地颁发者证书

提问于
浏览
40

我正在使用cUrl和PHP向服务器发出请求(用于访问PayPal)

Paypal开发者网站从未提及使用PayPal访问API需要SSL证书,但是我用来请求令牌的代码如下:

$options = array(
                CURLOPT_URL => $url,
                CURLOPT_POST => 1,
                CURLOPT_VERBOSE => 1,
                CURLOPT_POSTFIELDS => $postvals,
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_SSLVERSION => 3
);

curl_setopt_array($ch, $options);

$response = curl_exec($ch); 
echo curl_error($ch);

此echo输出以下错误:

SSL certificate problem: unable to get local issuer certificate

我的问题是:

1)如果我只需要获取用户电子邮件,是否需要SSL才能使用PayPal访问?

2)如果我不需要SSL,为什么会出现此错误?

PS: endpoints 如下:https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice

4 回答

  • 12

    correct 解决方案是修复您的PHP设置..将CURLOPT_SSL_VERIFYPEER设置为false是一个快速入侵,但它是's wrong as you disable the certificate validation by it'的证书颁发机构 . 这会让你暴露在中间人的攻击中 .

    它很容易修复(php 5.3.7或更高版本) - Download具有最新证书颁发机构的列表文件,并将此设置添加到 php.ini
    curl.cainfo=<path-to>cacert.pem

    重新启动您的Web服务器,它将工作!

  • 117

    您可以通过添加以下内容来禁用SSL验证(默认情况下从cURL 7.10开始启用):

    CURLOPT_SSL_VERIFYPEER, false
    

    你的 $optionshowever 正确的方法是保持验证 .

    SECURITY NOTICE

    如果远程站点使用由已知CA颁发的证书但验证仍然失败,则很可能在远程服务器上错误地设置了证书(缺少中间证书等) . 或者,您的系统不知道已使用签署目标证书的证书颁发机构 . 在这种情况下,你应该使用 php.inicurl.cainfodocumentation)指向所有支持的CA的有效PEM文件 - 这将使您的设置正确验证发行者链 .

    请注意,通过将 CURLOPT_SSL_VERIFYPEER 设置为 false ,您将解决此问题!你正在努力 . 这一切都与安全性有关,所以暂时这样做很好,但是在 生产环境 中将其部署在 生产环境 上是不明智的,礼貌地说,因为你会对Man In The Middle Attack开放 . 你被警告了 .

  • 5

    我有同样的问题

    Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate
    

    我使用在这里找到的paypal的github上生成的代码示例(我使用PHP):https://github.com/paypal/ipn-code-samples

    我下载了两个证书,并尝试从curl进行测试:http://curl.haxx.se/docs/caextract.html

    经过大约2个小时的测试(使用paypal的ipn模拟器)和谷歌搜索,发现paypal ipn无法在 localhost 上测试,所以我推动代码实时测试,但仍然得到相同的错误(即使权限设置为777) .

    当我设置 CURLOPT_SSL_VERIFYPEER, false 时,它可以工作,但这会破坏拥有ssl证书的目的 .

    在窥探我服务器的文件后,我在PHP文件夹中找到了一个 curl-ca-bundle.crt 文件 . 我决定将我的paypal ipn脚本中的 CURLOPT_CAINFO 硬编码到该路径 . 它终于奏效了!

    我注意到这个较旧的.crt文件包含一些证书,这些证书不在curl网站上的最新.crt文件中 . 这是来自 verisign class 1, verisign class 2, verisign class 3 and verisign class 4 的一堆证书 .

    这是我添加到curl的.crt文件的证书名称的完整列表:

    • Verisign Class 1公共主要证书颁发机构

    • Verisign 1级公共主要认证机构 - G2

    • Verisign 1级公共主要证书颁发机构 - G3

    • Verisign Class 2公共主要认证机构 - G2

    • Verisign Class 2公共主要证书颁发机构 - G3

    • Verisign Class 3公共主要证书颁发机构

    • Verisign Class 4公共主要认证机构 - G2

    这可能与@Andomar所说的有关 - paypal的verisign证书不包含在默认值(默认情况下,我的意思是curl的默认值)安全证书列表中 .

    我没有时间调试并确切地知道需要哪个证书,所以我只包括了所有证书 .

    对于将来遇到此问题的任何人,我建议从curl获取最新的证书,并逐一添加上面列表中的证书,直到错误消失为止 .

    以下是其中一些verisign证书的链接(您可能需要google以查找未列出的其他证书):www.symantec.com/page.jsp?id = root

    注意*:要查看paypal的当前证书,您可以在终端中运行此命令:

    openssl s_client -connect paypal.com:443 -showcerts
    

    如果有人对此问题有进一步的了解,请评论,因为我花了几个小时来计算以上所有内容 .

  • 2

    SSL证书问题:无法获得本地颁发者证书

    意味着cUrl不信任Verisign,即担保PayPal的证书颁发机构 . 正如Marc B评论,cUrl没有拥有任何证书颁发机构信任的较长船舶 .

    您可以使用以下选项绕过证书链验证:

    CURLOPT_SSL_VERIFYPEER => 0
    

    要了解如何配置cUrl以使其信任Verisign,请阅读cUrl documentation .

相关问题