私は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
correct解決策は、PHP setup .. CURLOPT_SSL_VERIFYPEERをfalseに設定するのは簡単なハックですが、間違っています認証局による証明書の検証を無効にすると、man-in-the-middle攻撃にさらされます。
修正は簡単です(php 5.3.7以降)- ダウンロード 最新の認証局を含むリストファイル、およびこの設定を追加あなたのphp.inicurl.cainfo=<path-to>cacert.pem
Webサーバーを再起動すると、動作します!
以下を追加することにより、SSL検証を無効にできます(cURL 7.10の時点でデフォルトで有効になっています)。
CURLOPT_SSL_VERIFYPEER, false
$options
、howeverに適切な方法は、検証を有効にしておくことです。
セキュリティ通知
リモートサイトが既知のCAによって発行された証明書を使用しても検証が失敗する場合、ほとんどの場合、証明書がリモートサーバーに誤って設定されています(中間証明書の欠如など)。あるいは、システムは、ターゲットの証明書に署名した使用済み認証局について何も知りませんでした。このような場合は、php.ini
のcurl.cainfo
( documentation )を使用して、サポートされているすべてのCAを含む有効なPEMファイルを指定する必要があります。
CURLOPT_SSL_VERIFYPEER
をfalse
に設定すると、[〜#〜] [〜#〜]で問題が解決されることに注意してください。あなたはそれを回避しています。これはすべてセキュリティに関するものなので、しばらくの間それを行うことは問題ありませんが、実稼働環境に展開することは賢明ではありません。丁寧に言えば、 Man In The Middle Attack です。あなたは警告されました。
私はまったく同じ問題を抱えていた
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ファイルに追加した証明書名の完全なリストです。
これは、@ Andomarが言ったことと関係があるかもしれません-Paypalのベリサイン証明書は、安全な証明書のデフォルト(デフォルトではcurlのデフォルトを意味します)リストに含まれていません。
デバッグする時間がなく、どの証明書が必要かを正確に把握することができなかったので、それらすべてを含めました。
将来この問題が発生する場合は、curlから最新の証明書を取得し、エラーがなくなるまで上記の証明書を1つずつ追加することをお勧めします。
以下に、これらのベリサイン証明書の一部へのリンクを示します(リストにない他の証明書については、Googleで検索する必要がある場合があります):www.symantec.com/page.jsp?id=roots
注*:Paypalの現在の証明書を表示するには、ターミナルでこのコマンドを実行します。
openssl s_client -connect Paypal.com:443 -showcerts
誰かがこの問題についてさらに洞察を持っている場合は、上記のすべてを理解するために何時間も費やしたのでコメントしてください。
SSL証明書の問題:ローカル発行者証明書を取得できません
CUrlは、Paypalを保証する認証局であるVerisignを信頼しないことを意味します。 Marc Bがコメントしているように、cUrlはどの認証局に対しても信頼できる状態で出荷されなくなりました。
次のオプションを使用して、証明書チェーンの検証をバイパスできます。
CURLOPT_SSL_VERIFYPEER => 0
Verisignを信頼するようにcUrlを構成する方法については、 cUrl documentation を参照してください。