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


187

Windows 7でXAMPPの一部としてPHPバージョン5.6.3を実行しています。

Mandrill APIを使用しようとすると、次のエラーが発生します。

キャッチされない例外「Mandrill_HttpError」とメッセージ「メッセージ/送信テンプレートへのAPI呼び出しが失敗しました:SSL証明書の問題:ローカル発行者証明書を取得できません」

php.iniファイルに以下を追加するなど、StackOverflowで読んだことはすべて試しました。

curl.cainfo = "C:\xampp\php\cacert.pem"

もちろん、その場所にhttp://curl.haxx.se/docs/caextract.htmlからcacert.pemファイルをダウンロードします

しかし、すべての後、XAMPPとApacheサーバーを再起動しましたが、それでも同じエラーが発生します。

他に何を試したらいいのか本当に分かりません。

誰か他に何を試すことができるかアドバイスできますか?


私の回答をご覧ください:stackoverflow.com/a/29649024/660410
Michal-sk

3
また、先頭の「;」を削除して、その行のコメントが外されていることを確認してください。; curl.cainfo = "C:\ xampp \ php \ cacert.pem"ではなく、curl.cainfo = "C:\ xampp \ php \ cacert.pem"にする必要があります
Jon Tan

HTTPS over HTTPを使用してもこのエラーが発生しますか?
javiniar.leonard

回答:


363

ついにこれが動作するようになりました!

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

  2. どこかにそれを置きます。私の場合、それはc:\wamp\ディレクトリでした(Wamp 64ビットを使用している場合はc:\wamp64\)。

  3. mod_sslApacheとphp_openssl.dllで有効にしますphp.ini;最初に削除してコメントを外します)。しかし、注意してください。私の問題は、2つのphp.iniファイルがあり、両方でこれを実行する必要があることでした。1つはWAMPタスクバーアイコンから取得するもので、もう1つは私の場合、C:\wamp\bin\php\php5.5.12\

  4. 次の行を両方のphp.iniファイルの証明書に追加します。

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. Wampサービスを再起動します。


3
私の場合、それはc:\ xamp \ディレクトリとそのWindows 7であり、このソリューションは完璧に機能します。感謝します...
Manu RS

1
最新の証明書バンドルは、元のcurlサイトcurl.haxx.se/docs/caextract.html
Paul

1
私の場合、行;の先頭にaがあり、コメントであることを認識するのに何時間もかかりました。したがって、私のような初心者の場合は;、同様に削除する必要があります
abhyudayasrinet 18/06/21

1
@SurajNeupaneわかりません、私はこれを取得するのに長い時間を費やしました。Homesteadのような仮想マシンを使用しており、これに対処する必要はありません。これは特定のケースでした
Mladen Janjetovic '13

1
これが鍵ですBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

免責事項:このコードは、サーバーを保護します。

$ this-> ch = curl_init();という行番号65の後のMandrill.phpファイルにも同じ問題がありました。

次の2行を追加します。

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

これで問題が解決し、localhostを使用してメールも送信されましたが、ライブバージョンライブでは使用しないことをお勧めします。ライブサーバーでは、このコードがなくてもコードは機能するはずです。


1
このバイパスなしで私の開発者環境を機能させるために私が試すことができるものは何ですか?
Dor Dadush

4
私にとっては、設定CURLOPT_SSL_VERIFYPEERfalse機能するだけです。
フランシスココラレスモラレス

29
技術的には正しいですが、SSLを無効にすることはお勧めできません。localhostでも、他の回答で述べたように証明書を適切にロードすることをお勧めします。
脊椎

技術的には正しいですが、SSLを無効にすることは悪い考えです。それが他の方法で働くのに猛烈に抵抗する場合でも、適切なsys-adminの方法よりも仕事を失う方が良いです。@Spinal

45

ありがとう@Mladen Janjetovic、

あなたの提案は、アンプがインストールされたMacで私にとってうまくいきました。

コピー: http : //curl.haxx.se/ca/cacert.pem

に: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

そしてphp.iniそのパスで更新し、Apacheを再起動しました:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

また、Windows AMPPSのインストールにも同じ設定を適用しましたが、その設定でも完全に機能しました。

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

:ワンプも同じ。

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

localhostにSANを使用して新しいSSL証明書を生成する方法を探している場合、この投稿の手順はでうまくいきましたCentos 7 / Vagrant / Chrome Browser


18

http://curl.haxx.se/docs/caextract.html ページを表示すると、次のセクションが大きな文字で表示されます。

RSA-1024を削除

それを読んでから、「RSA-1024」証明書を含む証明書のバージョンをダウンロードしてください。 https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

それらはマンドリルで動作します。

SSLを無効にすることは悪い考えです。


1
これにより、私が一日中苦労してきたAWS / Guzzle / cURLの問題が修正されました。ありがとうございました!
voidstate 2015年

@voidstate私はこれが古いことを知っていますが、これを使用してguzzleでバイパスすることもできます['verify' => false] 。ssl / curl / guzzleの完全なドキュメントについては、ここguzzle.readthedocs.org/en/latest/…にアクセスしてください。
ジョン

@John、しかしそれはあなたがしたいことではないSSL検証を無効にするでしょう、それで私はそうすることを勧めません。
Arturo Alvarado

1
Windowsの場合、ファイルをサーバーに保存して(例:C:\ curl \ curl-ca-bundle.crt)、php.iniに以下を追加します:[curl] curl.cainfo = " C:/curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C:/curl/curl-ca-bundle.crt "
voidstate

私はこれが何年もの間完全に機能した後(サーバーの変更後も存続しました)にこれを取得しましたが、ここで何が起こっているのか正確に理解できません。curlまたはopensslが更新されて、それがca-bundleがmailchimpと互換性のないものに変更されたのですか?
Sammaye 2016

11

上記の手順は役に立ちましたが、Windows 8では機能しませんでした。相互関係はわかりませんが、以下の手順は機能しました。基本的には、cacert.pemファイルの変更です。これが誰かを助けることを願っています。

  • ここからcacert.pemファイルをダウンロードします:http ://curl.haxx.se/docs/caextract.html
  • PHPインストールフォルダーにファイルを保存します。(例:xamppを使用している場合– c:\ Installation_Dir \ xampp \ php \ cacert.pemに保存します)。
  • php.iniファイルを開き、次の行を追加します。
  • curl.cainfo =” C:\ Installation_Dir \ xampp \ php \ cacert.pem” openssl.cafile =” C:\ Installation_Dir \ xampp \ php \ cacert.pem”
  • Apacheサーバーを再起動すると、問題が解決するはずです(必要に応じて、サービスを単純​​に停止および開始してください)。

11

curlを呼び出すために必要な証明書のない新しいソリューションを見つけたので、2行のコードを追加するだけです。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
これでうまくいくかもしれませんが、これはまったくお勧めできません。あなたは基本的に、すべての証明書を信頼していると言っています...そして、あなたが忘れて、コードがこの変更で製品化された場合、攻撃の可能性のためにあなたのアプリケーションを開きます... CAバンドルをダウンロードするのは実際にはそれほど作業ではありません。 PHPにポイントを追加します。
user919426

これはカールの概念です。そのため、curlを使用するときはいつでも、上記のコードを追加してください
Manish sharma

8

php.iniにアクセスできない場合、このコードを($ch = curl_init();行の後に)追加するとうまくいきます。

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

次に、ca-bundle.crtをダウンロードして、で指定した場所に保存するだけです$certificate_location


3

私はこの問題の非常に簡単な解決策を持っています。証明書ファイルなしでこれを行うことができます。

Laravelルートフォルダに移動->ベンダー-> guzzlehttp-> guzzle-> src

Client.phpを開きます

$ defaults Arrayを見つけます。このように見える..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

現在の主な仕事は、検証キーの値を変更することです。

'verify'          => false,

したがって、この後はCURLリクエストのSSL証明書をチェックしません...このソリューションは私にとってはうまくいきます。私は多くの研究の後にこの解決策を見つけました...


2

サーバーの展開に関する上記の回答について詳しく説明します。

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

展開時にサーバーを危険にさらすことなく、開発環境のトリックを実行する必要があります。


さまざまな環境でコードのさまざまな部分を実行することは、良い概念のように聞こえません-デバッグが難しくなります
Nico Haase

2

私はこれを試しました

開いた

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

そしてこれを変える

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

これに

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

AppVeyorでアプリをビルドしているときにも同じ問題が発生しました。

  • https://curl.haxx.se/ca/cacert.pemをダウンロードしてc:\php
  • opensslを有効にする echo extension=php_openssl.dll >> c:\php\php.ini
  • 証明書を見つけるecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

上記の解決策のいずれも機能しない場合は、XAMPPインストールを新しいバージョンに更新してみてください。

私はphp 5.5.11でXAMPPを実行していましたが、まったく同じコードが機能しませんでした。php5.6.28でXAMPPにアップグレードすると、上記のソリューションが機能しました。

さらに、PHPの更新のみが機能しなかったため、そのバージョンのXAMPPでのApacheとphpの設定の組み合わせのように見えます。

それが誰かを助けることを願っています。


0

次のようなエラーが発生しました:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Windowsマシンを使用しています。だから私は以下の手順に従いました。

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

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


0

ローカルシステムではこのような問題に直面していましたが、ライブサーバーでは発生していませんでした。以前このページで別のソリューションについても触れましたが、それはlocalhostで機能していませんでした。そのため、localhost-WAMPサーバーで機能する新しいソリューションを見つけてください。

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

システムがドライブにcacert.pemを見つけられない場合があります。CURLを使用するコードでこれを定義できます

OPEN-SSLライブラリのアクティブなど、このためのすべての条件を満たすことに注意してください。

CURLのこのコードを確認してください。

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

しかし、このソリューションはライブサーバーでは機能しない可能性があります。cacert.pemの絶対パスのため


0

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

update-ca-certificates

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

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


-4

がたがたにはこれを試すことができます。

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

guzzle / guzzle 3. *でテスト済み


1
200以上の賛成票で承認された回答があった3年前の質問に回答するポイントはありますか?
treyBake 2018年

私の答えは上記の答えよりも簡単です。数か月間10票の賛成票が得られます...
fico7489

1
私はそれを非常に疑い、OPでguzzleの言及を見なかった...だからそれは無関係の答えだ。誰かがJavaScriptの問題にjQueryソリューションを提供する場合も同じです。それは無関係です。
treyBake

ここで使用されていないという事実は変わりません。Linuxソリューションは、最も使用されているサーバーオペレーティングシステムであるため、Windowsユーザーに提案しますか?誰もがGuzzleの使用を望んでいるわけではありません。私は個人的に、長年PHPを使用してGuzzleを使用したことはありません。私にとって、HTTPリクエストは、そのパッケージを必要とすることはそれほど難しくありません。
treyBake

1
完全に知っている-それは単に必要ではない.. curlのドキュメントを読んでください、それはすべて自明です。賢くすることではありません...問題に適切に答えることです
treyBake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.