208

開発にXAMPPを使用しています。最近、xamppのインストールを古いバージョンから1.7.3にアップグレードしました。

HTTPS対応サイトをカールすると、次の例外が発生します

致命的なエラー:キャッチされない例外'RequestCore_Exception'とメッセージ'cURLリソース:リソースID#55; cURLエラー:SSL証明書の問題。CA証明書に問題がないことを確認してください。詳細:エラー:14090086:SSLルーチン:SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました(60) '

この問題を修正するには、PHPコードの特定のcurlオプションを使用することをお勧めします。私はこれが方法であるべきではないと思います。古いバージョンのXAMPPに問題はなく、新しいバージョンをインストールした後にのみ発生したためです。

PHPインストールでどの設定が変更されるかを理解するのに助けが必要です。Apacheなどでこの問題を解決できます。

4

12 に答える 12

292

これは、Windowsではかなり一般的な問題です。cacert.pemに設定するだけcurl.cainfoです。

PHP 5.3.7以降、次のことが可能になります。

  1. https://curl.se/ca/cacert.pemをダウンロードして、どこかに保存します。
  2. 更新php.ini-curl.cainfo="PATH_TO/cacert.pem"を追加します

それ以外の場合は、すべてのcURLリソースに対して次のことを行う必要があります。

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
于 2013-05-11T07:54:51.177 に答える
145

curl以前は承認された認証局(CA)のリストが含まれていましたが、7.18.1以降ではCA証明書をバンドルしなくなりました。そのため、デフォルトでは、すべてのTLS/SSL証明書が検証不能として拒否されます。

CAのルート証明書を取得し、それをポイントカールする必要があります。TLS/SSL証明書の検証に関するcurlの詳細をご覧ください。

于 2011-06-19T05:23:16.410 に答える
85

警告:これにより、SSLが保護するように設計されたセキュリティの問題が発生し、コードベース全体が安全でなくなる可能性があります。それはすべての推奨される慣行に反します。

しかし、私のために働いた本当に簡単な修正は、電話することでした:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

電話する前に:

curl_exec():

phpファイルで。

これにより、SSL証明書のすべての検証が無効になると思います。

于 2012-05-12T19:59:16.787 に答える
55

ソース:http ://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

#Curl:SSL証明書の問題、CA証明書に問題がないことを確認してください####072006年4月###

Curlを使用してセキュアURLを開くと、次のエラーが発生する場合があります。

SSL証明書の問題、CA証明書に問題がないことを確認してください

エラーの理由とその対処方法について説明します。

エラーを取り除く最も簡単な方法は、スクリプトに次の2行を追加することです。このソリューションは、セキュリティ上のリスクをもたらします。

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

この2つのパラメータが何をするか見てみましょう。マニュアルの引用。

CURLOPT_SSL_VERIFYHOST:1は、SSLピア証明書に共通名が存在するかどうかを確認します。2共通名の存在を確認し、指定されたホスト名と一致することも確認します。

CURLOPT_SSL_VERIFYPEER:FALSEは、CURLによるピアの証明書の検証を停止します。検証する代替証明書は、CURLOPT_CAINFOオプションを使用して指定するか、証明書ディレクトリーをCURLOPT_CAPATHオプションを使用して指定することができます。CURLOPT_SSL_VERIFYPEERが無効になっている場合(デフォルトは2)、CURLOPT_SSL_VERIFYHOSTもTRUEまたはFALSEである必要があります。CURLOPT_SSL_VERIFYHOSTを2(これはデフォルト値です)に設定すると、提示される証明書が、リモートリソースへのアクセスに使用しているURNと一致する「共通名」を持っていることが保証されます。これは正常なチェックですが、プログラムがだまされていないことを保証するものではありません。

###「中間者」を入力してください'###

プログラムが誤解されて、代わりに別のサーバーと通信する可能性があります。これは、DNSやarpポイズニングなどのいくつかのメカニズムによって実現できます(これは別の日の話です)。侵入者は、プログラムが期待しているのと同じ「コモン名」で証明書に自己署名することもできます。通信は暗号化されたままですが、あなたはあなたの秘密をなりすましに与えるでしょう。この種の攻撃は「中間者」と呼ばれます

###中間者攻撃'###

さて、私たちは私たちに提示されている証明書が実際に良いことを確認する必要があります。これを行うには、妥当な*信頼できる証明書と比較します。

リモートリソースがVerisignやGeoTrustなどのメインCAのいずれかによって発行された証明書によって保護されている場合は、 http://curl.se/docs/caextract.htmlから取得できるMozillaのCA証明書バンドルと安全に比較できます。

cacert.pemサーバーのどこかにファイルを保存し、スクリプトで次のオプションを設定します。

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

上記のすべての情報クレジットの場合:http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

于 2012-09-06T06:07:52.850 に答える
17

上記の解決策は素晴らしいですが、WampServerを使用している場合は、curl.cainfo変数の設定がphp.ini機能しない場合があります。

最終的に、WampServerには2つのphp.iniファイルがあることがわかりました。

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

前者は明らかにPHPファイルがWebブラウザを介して呼び出される場合に使用され、後者はコマンドがコマンドラインまたはを介して呼び出される場合に使用されますshell_exec()

TL; DR

WampServerを使用している場合は、両方のcurl.cainfoファイルに行を追加する必要があります。 php.ini

于 2014-09-07T03:04:34.390 に答える
6

聖なるものすべての愛のために...

私の場合、openssl.cafilePHP構成変数をPEMファイルパスに設定する必要がありました。

curl.cainfoPHPの設定での設定がまさに必要なものであるシステムがたくさんあることは確かですが、私が使用している環境では、 Debian 8(jessie)とPHPを使用するeboraas /laraveldockerコンテナーです。 5.6、その変数を設定してもうまくいきませんでした。

の出力には、その特定の構成設定について何も記載されていないことに気付きましたが、php -iについては数行ありましたopensslopenssl.capathとオプションの両方がありopenssl.cafileますが、2番目のオプションを設定するだけで、PHPを介したcurlがHTTPSURLで最終的に問題ないようになりました。

于 2017-02-28T04:42:26.653 に答える
4

連絡しようとしているアプリケーションに自己署名証明書がある場合、http://curl.haxx.se/ca/cacert.pemの通常のcacert.pemで問題が解決しないことがあります。

サービスエンドポイントのURLがわかっている場合は、ブラウザでアクセスし、証明書を「チェーン付きX 509証明書(PEM)」形式で手動で保存します。この証明書ファイルを

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
于 2013-12-18T18:52:16.887 に答える
4

AmazonAMIlinuxでも同じエラーが発生します。

/etc/php.d/curl.iniにcurl.cainfoを設定して解決しました

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

2018年10月追加

Amazon Linux v1では、このファイルを編集します

vi /etc/php.d/20-curl.ini

この行を追加するには

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"
于 2014-10-09T02:43:16.277 に答える
3

CURLOPT_CAINFOのcurlオプションを設定するときは、一重引用符を使用することを忘れないでください。二重引用符を使用すると、別のエラーが発生するだけです。したがって、オプションは次のようになります。

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

さらに、php.iniファイルの設定は次のように記述する必要があります:(二重引用符に注意してください)

curl.cainfo = "C:\wamp\www\mywebfolder"

私はそれをこれを言う線のすぐ下に置きます:extension=php_curl.dll

(整理の目的でのみ、任意の場所に配置できます。php.ini別のcurl参照の近くに配置するだけなので、キーワードcurlを使用して検索すると、1つの領域で両方のcurl参照が見つかります。)

于 2014-09-30T15:27:31.840 に答える
2

www.googleapis.comからページを取得するためにGuzzleHttp(Macではphp + apache)を取得しようとしたときに、ここに行き着きました。

それが誰かを助ける場合に備えて、これが私の最終的な解決策でした。

このエラーが発生しているドメインの証明書チェーンを確認してください。私にとってはgoogleapis.comでした

openssl s_client -host www.googleapis.com -port 443

次のようなものが返されます。

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

注:問題を修正した後でこれをキャプチャしました。チェーンの出力が異なる場合があります。

次に、phpで許可されている証明書を確認する必要があります。ページでphpinfo()を実行します。

<?php echo phpinfo();

次に、ページ出力からロードされた証明書ファイルを探します。

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

これは、正しい証明書を追加して修正する必要のあるファイルです。

sudo nano /usr/local/php5/ssl/certs/cacert.pem

基本的に、このファイルの最後に正しい証明書「署名」を追加する必要があります。

あなたはここでそれらのいくつかを見つけることができます:あなたがそれらを必要とするならば、あなたはチェーンの他のものをグーグル/検索する必要があるかもしれません。

彼らはこのように見えます:

証明書イメージの例

注:これは画像であるため、stackoverflowから証明書をコピーして貼り付けるだけでは不十分です

適切な証明書がこのファイルに含まれたら、apacheを再起動してテストします。

于 2017-04-18T21:45:23.330 に答える
0

パッケージを再インストールするか、ここでca-certificates説明するように問題の証明書を明示的に許可することができます。

于 2019-04-11T18:34:07.967 に答える
-5

解決策はとても簡単です!この行を前に置きますcurl_exec

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

私にとってはうまくいきます。

于 2014-01-02T18:32:37.343 に答える