web-dev-qa-db-ja.com

Paypalアクセス-SSL証明書:ローカル発行者証明書を取得できません

私はcUrlとPHPを使ってサーバーにリクエストを送信しています(Paypalアクセス用)

Paypal開発者のWebサイトでは、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);

このエコーは次のエラーを出力します。

SSL certificate problem: unable to get local issuer certificate

私の質問は:

1)ユーザーのメールを取得するだけでよい場合、Paypalアクセスを使用するにはSSLが必要ですか?

2)SSLが必要ない場合、なぜこのエラーが発生しますか?

PS:エンドポイントは次のとおりです。 https://www.sandbox.Paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice

41
Luca Pennisi

correct解決策は、PHP setup .. CURLOPT_SSL_VERIFYPEERをfalseに設定するのは簡単なハックですが、間違っています認証局による証明書の検証を無効にすると、man-in-the-middle攻撃にさらされます。

修正は簡単です(php 5.3.7以降)- ダウンロード 最新の認証局を含むリストファイル、およびこの設定を追加あなたのphp.ini
curl.cainfo=<path-to>cacert.pem

Webサーバーを再起動すると、動作します!

120
oori

以下を追加することにより、SSL検証を無効にできます(cURL 7.10の時点でデフォルトで有効になっています)。

CURLOPT_SSL_VERIFYPEER, false

$optionshoweverに適切な方法は、検証を有効にしておくことです。

セキュリティ通知

リモートサイトが既知のCAによって発行された証明書を使用しても検証が失敗する場合、ほとんどの場合、証明書がリモートサーバーに誤って設定されています(中間証明書の欠如など)。あるいは、システムは、ターゲットの証明書に署名した使用済み認証局について何も知りませんでした。このような場合は、php.inicurl.cainfodocumentation )を使用して、サポートされているすべてのCAを含む有効なPEMファイルを指定する必要があります。

CURLOPT_SSL_VERIFYPEERfalseに設定すると、[〜#〜] [〜#〜]で問題が解決されることに注意してください。あなたはそれを回避しています。これはすべてセキュリティに関するものなので、しばらくの間それを行うことは問題ありませんが、実稼働環境に展開することは賢明ではありません。丁寧に言えば、 Man In The Middle Attack です。あなたは警告されました。

12
Marcin Orlowski

私はまったく同じ問題を抱えていた

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]ファイルを見つけました。PaypalipnスクリプトのCURLOPT_CAINFOをそのパスにハードコードすることにしました。ついにうまくいきました!

この古い.crtファイルには、curl Webサイトの最新の.crtファイルにないいくつかの証明書が含まれていました。 verisign class 1, verisign class 2, verisign class 3 and verisign class 4からの証明書の束でした。

以下は、curlの.crtファイルに追加した証明書名の完全なリストです。

  • ベリサインクラス1パブリックプライマリ認証局
  • ベリサインクラス1パブリックプライマリ認証局-G2
  • Verisign Class 1 Public Primary Certification Authority-G3
  • ベリサインクラス2パブリックプライマリ認証局-G2
  • ベリサインクラス2パブリックプライマリ認証局-G3
  • ベリサインクラス3パブリックプライマリ認証局
  • ベリサインクラス4パブリックプライマリ認証局-G2

これは、@ Andomarが言ったことと関係があるかもしれません-Paypalのベリサイン証明書は、安全な証明書のデフォルト(デフォルトではcurlのデフォルトを意味します)リストに含まれていません。

デバッグする時間がなく、どの証明書が必要かを正確に把握することができなかったので、それらすべてを含めました。

将来この問題が発生する場合は、curlから最新の証明書を取得し、エラーがなくなるまで上記の証明書を1つずつ追加することをお勧めします。

以下に、これらのベリサイン証明書の一部へのリンクを示します(リストにない他の証明書については、Googleで検索する必要がある場合があります):www.symantec.com/page.jsp?id=roots

注*:Paypalの現在の証明書を表示するには、ターミナルでこのコマンドを実行します。

openssl s_client -connect Paypal.com:443 -showcerts

誰かがこの問題についてさらに洞察を持っている場合は、上記のすべてを理解するために何時間も費やしたのでコメントしてください。

5
Truchainz

SSL証明書の問題:ローカル発行者証明書を取得できません

CUrlは、Paypalを保証する認証局であるVerisignを信頼しないことを意味します。 Marc Bがコメントしているように、cUrlはどの認証局に対しても信頼できる状態で出荷されなくなりました。

次のオプションを使用して、証明書チェーンの検証をバイパスできます。

CURLOPT_SSL_VERIFYPEER => 0

Verisignを信頼するようにcUrlを構成する方法については、 cUrl documentation を参照してください。

2
Andomar