web-dev-qa-db-ja.com

HTTPSおよびSSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました、CAは正常です

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

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

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

誰もがこの問題を解決するためにPHPコードからの特定のcurlオプションを使うことを勧めます。私はこれが道ではないはずだと思います。古いバージョンのXAMPPには問題がなく、新しいバージョンをインストールした後にのみ発生したからです。

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

202
Josnidhin

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

あなたはあなたのCAの証明書を取得し、それにカールする必要があります。 cURLSの サーバーSSL証明書の詳細 に詳細があります。

142
Marc B

これはWindowsでよく見られる問題です。 cacert.pemcurl.cainfoに設定するだけです。

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

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

それ以外の場合は、すべてのcURLリソースについて次の手順を実行する必要があります。

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

警告:これは、SSLが保護するように設計されているため、コードベース全体が不安定になるというセキュリティ上の問題を引き起こす可能性があります。それはすべての推奨される習慣に反します。

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

呼び出す前に:

curl_exec():

phpファイルにあります。

私はこれがSSL証明書のすべての検証を無効にすると信じています。

83
Chris Dutrow

出典: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

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

2006年4月7日

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

「真ん中の男」を入力してください

あなたのプログラムは、その代わりに他のサーバーと話すことに誤解を招く可能性があります。これは、dnsやarp中毒のようないくつかのメカニズムを通して達成できます(これは別の日の話です)。侵入者は、あなたのプログラムが期待しているのと同じ「共通名」で証明書に自己署名することもできます。通信は依然として暗号化されていますが、あなたはあなたの秘密を詐欺師に配っているでしょう。この種の攻撃は「中間者」と呼ばれます。

「真ん中の男」を倒す

さて、私たちは私たちに提示されている証明書が本物のために良いことを検証する必要があります。私たちはこれを妥当な証明書と比較することによってこれを行います。

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

ファイル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

52
Deepak Oberoi

上記の解決策は素晴らしいですが、もしあなたがWampServerを使っているのなら、curl.cainfophp.ini変数の設定はうまくいかないかもしれません。

私は結局WampServerが2つのphp.iniファイルを持っているのを見つけました:

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

最初のファイルはPHPファイルがWebブラウザから呼び出されたときに使用され、2番目のファイルはコマンドラインまたはShell_exec()からコマンドが呼び出されたときに使用されます。

TL; DR

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

16
Nate

あなたが連絡しようとしているアプリケーションが自己署名証明書を持っている場合は時々 http://curl.haxx.se/ca/cacert.pemからの通常のcacert.pem は問題を解決しません。

サービスエンドポイントのURLが確実な場合は、ブラウザで確認して、証明書を「X 509証明書とチェーン(PEM)」の形式で手動で保存します。この証明書ファイルを

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
4
madRai

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

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

私は、PHPの設定でcurl.cainfoを設定することがまさに必要とされる多くのシステムがあることを確信していますが、私が取り組んでいる環境では、 eboraas/laravel Dockerコンテナ。Debian8(jessie)とPHP 5.6を使い、その変数を設定してもうまくいきません。

私は、php -iの出力がその特定の設定について何も言及していないことに気づきましたが、opensslについては数行ありました。 openssl.capathopenssl.cafileの両方のオプションがありますが、2番目のオプションを設定するだけでPHPを介したcurlが可能になり、最終的にHTTPS URLで問題なく動作します。

4

Amazon AMI linuxでも同じエラーがあります。

/ etc/php.d/curl.inicurl.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"
4
Reinaldo Mendes

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

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を使って検索するとき私は1つの領域で両方のcurl参照を見つけることができます。)

3
LOwens1931

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

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

あなたはここでそれらのうちのいくつかを見つけることができます:あなたがそれらを必要とするならば、あなたはgoogle/chainで他の人を検索する必要があるかもしれません。

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

example certificate image

注:これはイメージなので、人々は単にstackoverflowから証明書をコピー/貼り付けしないでください。)

正しい証明書がこのファイルに入ったら、Apacheを再起動してテストします。

1
TrophyGeek

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

0
site