cURLエラー60:SSL証明書:ローカル発行者証明書を取得できません


232

ローカル開発環境でWAMPを使用していて、クレジットカードに請求しようとしていますが、次のエラーメッセージが表示されます。

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

私はGoogleでたくさん検索しましたが、多くの人がこのファイルcacert.pemをダウンロードしてどこかに置き、php.iniで参照することを勧めています。これは私のphp.iniの一部です:

curl.cainfo = "C:\Windows\cacert.pem"

それでも、サーバーを数回再起動してパスを変更した後でも、同じエラーメッセージが表示されます。

ApacheモジュールのWAMPを使用し、ssl_moduleを有効にしています。そして、PGP拡張機能から、php_curlを有効にしています。

まだ同じエラーメッセージ。なぜそれが起こっているのですか?

今私はこの修正に従っています:PHP CURLエラー60 SSLを修正する方法

これは、これらの行をcURLオプションに追加することを示唆しています。

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

cURLにオプションをどこに追加しますか?私のCLIはコマンド「curl_setopt」を見つけられないので、どうやらコマンドラインを介さない

編集

これは私が実行しているコードです:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}

コードに問題がないと仮定すると、ファイアウォールである可能性があります。ファイアウォールを無効にしてテストしてください。
Waqar ul islam 2015

ここでこの質問への回答をしませんでしか?:)
リモンモンテ2015

@limonteは可能で、プロジェクトを切り替える必要があり、おそらく新しいプロジェクトでも同じ問題が発生していました。guzzleの問題に戻ります。おそらく同じ修正です。brb
LoveAndHappiness

1
最新バージョンのストライプを試しましたか?私が見本命で行うように変更何か...というメッセージをコミットgithub.com/stripe/stripe-php/commit/...
thelastshadow

1
@LoveAndHappinessこの問題の解決策はありますか?ストライプで同じエラーが発生しています。解決策がありましたらお知らせください。
Dev

回答:


515

XAMPPを使用するWindowsを想定した実用的なソリューション:

XAMPPサーバー

  1. 他の環境でも同様
    • ここからcacert.pemをダウンロードして抽出します(クリーンなファイル形式/データ)

https://curl.haxx.se/docs/caextract.html

  1. ここの次のディレクトリに置きます。

C:\ xampp \ php \ extras \ ssl \ cacert.pem

  1. php.iniのこのセクションに次の行を追加します( "c:\ xampp \ php \ php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  1. webserver / apacheを再起動します

  2. 問題が解決しました!

(参照:https : //laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate


6
このメッセージは、PHPのバージョンが原因で表示されます。PHP 5.5以降の場合、PHP 5.6の新機能のためにこのエラーが発生します。PHP 5.6は、cURLを使用している場合は証明書を確認します。
UWU_SANDUN

9
答えてくれてありがとう!公式のcurl-pageのcacert.pemを使用することをお勧めしますが、curl.haxx.se / docs
dieBeiden

6
これを機能させることができない人のために指摘したかっただけです-私はスラッシュを使用curl.cainfo = "C:/cacert.pem"し、それを機能させるためにコンピューターを再起動する必要がありました。Webサーバーを再起動するだけでは不十分でした。うまくいけば
:)

1
コメントをcurl.cainfo外すことを忘れないでください(facepalm)
エドモンドスルザノク

魅力のように働いた!ありがとう
ジャック

55

Wamp / Wordpress / windowsユーザーに注意してください。質問はWAMPに関するものでしたが、質問がXAMPPに回答され、WAMPユーザーには回答されなかったため、間違ったphp.iniファイルを編集していたため、何時間もこの問題が発生しました。

これが私がやったことです

証明書バンドルをダウンロードします。

中に入れて C:\wamp64\bin\php\your php version\extras\ssl

ファイルmod_ssl.soが中にあることを確認してくださいC:\wamp64\bin\apache\apache(version)\modules

Apacheディレクトリ内で有効mod_sslにするhttpd.confC:\wamp64\bin\apache\apache2.4.27\conf

で有効にphp_openssl.dllphp.iniます。私の問題は、2つのphp.iniファイルがあり、両方で実行する必要があることです。1つ目は、WAMPタスクバーアイコンの内側にあります。

ここに画像の説明を入力してください

もう1つは C:\wamp64\bin\php\php(Version)

両方のphp.iniファイルの場所を見つけ、行curl.cainfo =を見つけて、次のようなパスを指定します

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

ファイルを保存してサーバーを再起動すると、準備完了です。


使用するつもりのphp.iniを実行するよりも、両方のphp.iniを実行する必要があります。SAPIクライアントとしてapacheを使用している場合は、apache dirで修正するか、クライアントで修正します。 php.exeをSAPIとして使用する場合はdir。
Fabien Haddadi、

3
「両方でこれを行う必要があります」が基調講演です。ありがとう
JaroslavKlimčík18年

1
これは、「guzzlehttp / guzzle」を使用するLaravel 5.5で機能します:「^ 6.3」。Wampサーバー3.1.3。Php 7.1 *
Deepesh Thapa

これは働いた。ありがとう
user4906240

wampに回答していただきありがとうございます
アルトイド

46

GuzzleでPHP 5.6を使用している場合、Guzzleは証明書の自動検出ではなく、PHPライブラリーを使用するように切り替えました(参照)。PHPはここで変更の概要を説明します

PHP / Guzzleが証明書を探している場所を見つける

PHPが探している場所をダンプするには、次のようにします。

 var_dump(openssl_get_cert_locations());

証明書バンドルの入手

OS Xテストでは、homebrewをbrew install openssl使用openssl.cafile=/usr/local/etc/openssl/cert.pemしてopensslをインストールしてから、php.iniまたはZend Serverの設定(OpenSSLの下)で使用できます。

証明書バンドルは、curl Webサイトのcurl / Mozillaから入手することもできます:https : //curl.haxx.se/docs/caextract.html

証明書の場所をPHPに通知する

バンドルを取得したら、PHPがすでに探している場所に配置するか(上記で見つけたもの)openssl.cafile、php.iniで更新します。(一般的に、/etc/php.iniまたは/etc/php/7.0/cli/php.iniあるいは/etc/php/php.iniUnix上で。)


3
はい。多くの人が複数のバージョン番号によるダウングレードの明らかに間違ったアプローチを提案しているのを見た後、これは正しいアプローチの私見です。私はcafileに関する他の人の助言に従いましたが、それでもロードされない理由をテストする手段がありませんでした。このopenssl_get_cert_locations()関数は、実際に問題を特定するのに役立ちました。ありがとう!
Webおよびフロー

1
を提供していただきありがとうございますopenssl_get_cert_locations。デバッグがはるかに簡単になりました。WAMPは、apache phpとconsole phpで異なるiniファイルを使用しているようです。私の場合、openssl.cafile="c:/_/cacert.pem"コンソールベースのphp を追加する必要がありました。前回、Apacheを介して使用curl.cainfo="c:/_/cacert.pem"する場合は、動作させる必要がありました。
psycho brm 2018

16

Cartalyst / stripeで使用されるGuzzleは、サーバー証明書をチェックするための適切な証明書アーカイブを見つけるために、次のことを行います。

  1. openssl.cafilephp.iniファイルにが設定されているかどうかを確認します。
  2. curl.cainfophp.iniファイルにが設定されているかどうかを確認します。
  3. /etc/pki/tls/certs/ca-bundle.crt存在するかどうかを確認します(Red Hat、CentOS、Fedora、ca-certificatesパッケージで提供)。
  4. /etc/ssl/certs/ca-certificates.crt存在するかどうかを確認します(Ubuntu、Debian、ca-certificatesパッケージで提供)。
  5. 確認する /usr/local/share/certs/ca-root-nss.crt存在するます(FreeBSD、ca_root_nssパッケージで提供)
  6. /usr/local/etc/openssl/cert.pem(OS X;自作)かどうかを確認します。
  7. C:\windows\system32\curl-ca-bundle.crt存在するかどうかを確認する(Windows)
  8. C:\windows\curl-ca-bundle.crt存在するかどうかを確認する(Windows)

簡単なテストを実行して、最初の2つの設定の値が適切に定義されていることを確認します。

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

または、#7または#8で示された場所にファイルを書き込んでみてください。


13

php.iniを変更できない場合は、次のようなコードからcacert.pemファイルをポイントすることもできます。

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);

8

私が行ったのはvar_dump(openssl_get_cert_locations()); die;、任意のphpスクリプトで使用したもので、ローカルのphpが使用しているデフォルトに関する情報が得られました。

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

お気づきのように、ini_cafileまたはiniオプションcurl.cainfoを設定しました。しかし私の場合、curlは存在しない「default_cert_file」を使用しようとします。

https://curl.haxx.se/ca/cacert.pemからファイルをコピーしました「default_cert_file」の場所(c:/openssl-1.0.1c/ssl/cert.pem)にそれを取得することができました仕事に。

これが唯一の解決策でした。


私は同様の問題を抱えており、私の場所はc:/usr/local/ssl/cert.pemのようなものですが、この場所は存在しません、それが何であるかをあなたに教えますそれが理由で、私は他のすべてを試しました、それは.iniファイルに証明書の場所を追加していますが、それは機能しません、あなたのソリューションは理にかなっているので機能するはずですが、その場所を変更できず、証明書を置くことができません存在しない場所に。
AbdulMueed 2017年

フォルダを作成して、指定したパスに証明書を配置できますか?
ジョージドネフ2017年

7

ある日、Guzzle(5)スクリプトがSSL経由でホストに接続しようとしたときに、この問題が突然発生しました。もちろん、Guzzle / CurlのVERIFYオプションを無効にすることもできますが、それは明らかに正しい方法ではありません。

私はここにリストされているすべてを同様のスレッドで試し、最終的にopensslを使用してターミナルに行き、接続しようとしているドメインに対してテストしました:

openssl s_client -connect example.com:443 

...そして、次のことを示す最初の数行を受け取りました:

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

...他の目的地(例:google.comなど)を試したとき、すべてがうまくいった

これは私が接続しようとしていたドメインに連絡するように私に促しました、そして実際、彼らはそれらの端で忍び寄った問題を抱えていました。それは解決され、私のスクリプトは動作するようになりました。

だから...髪を引っ張っている場合は、opensslを試して、接続しようとしている場所からの応答に何か問題があるかどうかを確認してください。たぶん、問題は結局それほど「ローカル」ではないかもしれません。


6

私に役立つ解決策を見つけました。最新のguzzleからバージョン〜4.0にダウングレードしましたが、うまくいきました。

composer.jsonに「guzzlehttp / guzzle」を追加:「〜4.0」

それが誰かを助けることを願って


また、バージョン5/6の機能を使用できなくなります。代わりに、param配列(requestメソッドの3番目のパラメーター)でverifyをfalseに設定するだけです。$ client-> request( 'GET'、 '/'、['verify' => false]);
S ..

3

php.iniWindow Explorerでファイルを直接開いていることを確認してください。(私の場合:)C:\DevPrograms\wamp64\bin\php\php5.6.25

php.iniシステムトレイのWamp / Xampアイコンのメニューにあるショートカットを使用しないでください。この場合、このショートカットは機能しません。

次にそれを編集しphp.iniます:

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

そして

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

保存後php.ini、Wampアイコンで「すべてのサービスを再起動」したり、CMDを閉じたり再度開いたりする必要はありません。


2

やってみました..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

信頼できるソースを使用している場合は間違いなく、SSL証明書を確認する必要はありません。


2

この問題を理解するのに時間がかかりすぎました。

PHPバージョン5.5があり、5.6にアップグレードする必要がありました。

バージョン5.6未満では、Guzzleは独自のcacert.pemファイルを使用しますが、PHPの上位バージョンでは、システムのcacert.pemファイルを使用します。

また、https://curl.haxx.se/docs/caextract.htmlからファイルをダウンロードし、php.iniに設定しました。

Guzzles StreamHandler.phpファイルにある回答https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.

2

答えはすべて正解です。しかし、最も重要なことは、正しいphp.iniファイルを見つける必要があることです。コマンド「php --ini」でこのコマンドを確認してください正しい答えではありません、正しいphp.iniファイルを見つけるためで。

編集した場合

curl.cainfo ="PATH/cacert.pem"

そしてチェック

var_dump(openssl_get_cert_locations()); 

次に、curl.cainfoに値が必要です。そうでない場合、それは正しくないphp.iniファイルです。

* wamp / binまたはxxamp / binまたは使用するサーバーで* .iniを検索し、1つずつ変更して確認することをお勧めします。*


1

guzzlehttp/guzzlecomposerパッケージを使用するLaravel 4 phpフレームワークで同じ問題が発生しました。何らかの理由で、mailgunのSSL証明書の検証が突然停止し、同じ「エラー60」メッセージが表示されました。

私のようにphp.ini、にアクセスできない共有ホスティングを使用している場合、他の解決策は不可能です。いずれにせよ、Guzzleにはこのクライアント初期化コードがあり、php.ini効果を無効にする可能性が最も高くなります。

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

ここでGuzzleは、cURLの環境によって提供されるものを使用する代わりに、おそらく古くなっている独自の内部cacert.pemファイルの使用を強制します。この行を変更すると(少なくともLinuxでは)、cURLのデフォルトのSSL検証ロジックを使用するようにGuzzleが構成され、問題が修正されました。

        'verify'          => true

falseSSL接続のセキュリティを気にしない場合は、これをに設定することもできますが、これは良い解決策ではありません。

のファイルは vendor改ざんされることを意図ていない Guzzleクライアント構成することをお勧めしますが、これはLaravel 4で行うには難しすぎます。

これが他の誰かに数時間のデバッグを救ってくれることを願っています...


1

これはエッジケースの可能性がありますが、私の場合、問題はクライアントのcurl.cainfo構成(既にで構成済みphp.ini)ではなく、リモートサーバーが適切に構成されていないことでした。

チェーン内の中間証明書は送信されませんでした。Chromeを使用してサイトを閲覧するときにエラーは発生しませんでしたが、PHPでは次のエラーが発生しました。

cURLエラー60

中間証明書をリモートWebサーバー構成に含めた後、中間証明書は機能しました。

このサイトを使用して、サーバーのSSL構成を確認できます。

https://whatsmychaincert.com/


1

実行する'var_dump(php_ini_loaded_file());' と、この出力がページに表示されます 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

phpに証明書ファイルを読み込ませるには、このパスのphp.iniを編集して、ダウンロードした場所を'C:\Development\bin\apache\apache2.4.33\bin\php.ini' 追加しopenssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"https: //curl.haxx.se/docs/caextract.htmlから証明書ファイルを配置しました

Windows 10で、drupal 8、wamp、php7.2.4を使用


0

私はこの問題の適切な解決策を持っています。この問題の根本的な原因を試して理解してみましょう。この問題は、システムの証明書ストアにあるルート証明書を使用してリモートサーバーのSSLを検証できない場合、またはチェーンSSLとともにリモートSSLがインストールされていない場合に発生します。root sshアクセスが可能なLinuxシステムの場合、この場合、以下のコマンドで証明書ストアを更新してみてください:

update-ca-certificates

それでも機能しない場合は、リモートサーバーのルート証明書と中間証明書を証明書ストアに追加する必要があります。ルート証明書と中間証明書をダウンロードし、それらを/ usr / local / share / ca-certificatesディレクトリに追加して、commandを実行できupdate-ca-certificatesます。これでうまくいくはずです。同様に、Windowsの場合は、ルート証明書と中間証明書を追加する方法を検索できます。

この問題を解決するもう1つの方法は、ssl証明書をドメインルート証明書、中間証明書、ルート証明書のバンドルとして追加するようリモートサーバーチームに依頼することです。


-1

Windowsを使用しているので、パス区切り文字は '\'(およびLinuxでは '/')だと思います。定数を使用してみてくださいDIRECTORY_SEPARATOR。コードはよりポータブルになります。

試してください:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

編集:フルパスを記述します。相対パスにいくつか問題がありました(おそらくcurlは別のベースディレクトリから実行されますか?)


1
特定のStripeライブラリを使用する場合、実際のcURL設定は制御不能であるため、これは違いをもたらしません。
ジャック

-1

WAMPを使用する場合は、Apacheのphp.iniに証明書行を追加する必要があります(デフォルトのphp.iniファイルに加えて):

[curl]
curl.cainfo = C:\your_location\cacert.pem

php5.3以降で動作します


はい!Apacheとphpバージョンの両方のphp.iniファイルを編集するように注意してください。WAMPユーザーの場合、この答えは私の問題を解決することでした:stackoverflow.com/questions/28858351/...
MavBzh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.