13

cURL を使用して、WordPress プラグインで PayPal トランザクションを検証します。最近、トランザクションを確認できなかったため、ユーザーが購入プロセスを完了できないというバグ レポートを受け取るようになりました。私はエラーを追跡しました:

SSL certificate problem, verify that the CA cert is OK. Details: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

ここ StackOverflow で同じ問題に関連する多くの質問を見つけました。それらのほとんどは、解決策はCURLOPT_CAINFOcURL のオプションを使用して CA のバンドルを提供することであると述べました。http://curl.haxx.se/ca/cacert.pemの最新バージョン (2012 年 6 月 28 日に変換) をダウンロードして、プラグインと共に出荷しています。それは私が受け取った問題のほとんどを解決しました。

ここでの問題は、支払いが失敗したという別のレポートを受け取ったところですが、エラーは同じでした: SSL certificate problem, verify that the CA cert is OK.. 興味深いのは、解決策はオプションを削除することだったということです。CURLOPT_CAINFOこれについての説明があるかどうか疑問に思っています。ダウンロードしたものなど、更新された CA バンドルを使用するのが一般的な解決策だと思っていましたが、そうではないようです。

この種の問題の一般的な解決策は何でしょうか? また、更新された CA バンドルを使用すると、SSL 証明書の問題が修正されるのではなく、問題が発生することを説明できるものは何ですか?

これは cURL 構成です。

<?php
    $ch = curl_init("https://www.paypal.com/cgi-bin/webscr");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
?>

更新: www.paypal.com の証明書は VeriSign によって署名されています。証明書階層 (Firefox で表示) は次のとおりです。

  • VeriSign Class 3 Public Primary Certification Authority - G5
  • VeriSign Class 3 Extended Validation SSL CA
  • www.paypal.com

VeriSign Class 3 Public Primary Certification Authority - G5の証明書が、使用しているhttp://curl.haxx.se/ca/cacert.pemのバージョンに含まれていることを確認できます。

ご協力いただきありがとうございます。

4

2 に答える 2

4

このURLを参照してください

http://davidwalsh.name/php-ssl-curl-error

または試してみてください

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,'https://thirdparty.com/token.php'); //not the actual site
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,'customer_id='.$cid.'&password='.$pass);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); 
curl_setopt($ch,CURLOPT_CAINFO,'mozilla.pem'); /* fixed! */
$result = curl_exec($ch);
if(empty($result)) { /* error: nothing returned */ } else { /* success! */ }
curl_close($ch);
于 2012-09-06T17:18:47.420 に答える