ローカルの開発環境でWAMPを使っていて、クレジットカードに課金しようとしているのですが、エラーメッセージが表示されます:
cURLエラー60: SSL証明書の問題: ローカルの発行者証明書を取得できません。
Googleでいろいろ検索したところ、多くの人がこのファイルをダウンロードするよう勧めています:cacert.pemをダウンロードし、どこかに置いて、php.iniで参照することを勧めています。これは私のphp.iniの部分です:
curl.cainfo = "C:\Windows\cacert.pem"
しかし、サーバーを何度か再起動してパスを変更しても、同じエラーメッセージが表示されます。
ApacheモジュールからWAMPを使用し、ssl_moduleを有効にしています。また、PGP extensionsからphp_curlを有効にしています。
それでも同じエラーメッセージです。なぜこのようなことが起こるのでしょうか?
現在、私はこの修正に従っています: PHP CURL Error 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');
}
作業ソリューション:
-窓を想定。
XAMPPサーバー。
他の環境でも同様です。 -cacert.pemのダウンロードと抽出はここにあります(クリーンファイル形式/データ)。
-ここに置いてください。
C:\ xampp \ php \ extras \ ssl \ cacert.pem。
-php.iniでこの行をこのセクションに配置します( "c:\ xampp \ php \ php.ini"):
;;;;;;;;;;;;;;;;;;;; ; php.iniオプション;。 ;;;;;;;;;;;;;;;;;;;; 。 curl.cainfo = "C:\ xampp \ php \ extras \ ssl \ cacert.pem"。
-ウェブサーバー/アパッチを再起動します。
問題は解決しました。!
GuzzleでPHP 5.6を使用している場合、Guzzleはプロセスではなく、証明書にPHPライブラリautodetectを使用するように切り替えました(ref)。 PHPは変更の概要を示していますここ。
PHPが探している場所を以下を使用してダンプできます。
var_dump(openssl_get_cert_locations());
OS Xテストでは、homebrewを使用してopenssl brew install openssl
をインストールし、php.iniまたはZend Server設定で openssl.cafile = / usr / local / etc / openssl / cert.pem
を使用できます( OpenSSLの下)。
証明書バンドルは、カールWebサイトのcurl / Mozillaからも入手できます。https://curl.haxx.se/docs/caextract.html。
バンドルができたら、PHPが既に見ている場所(上記で確認した)に配置するか、php.iniで「openssl.cafile」を更新します。 (一般に、Unixでは /etc/php.ini
または/ etc / php / 7.0 / cli / php.ini
または /etc/php/php.ini
。)。
注意Wamp / Wordpress / windowsユーザー。 私はこの問題を何時間も抱えていましたが、正しい答えでさえ私のためにそれをしていませんでした。質問がWAMPに関するものであったとしても、質問はWAMPユーザーではなくXAMPPに回答されたため、間違ったphp.iniファイルを編集していたからです。
これが私がしたことです。
C:\ wamp64 \ bin \ php \ your php version \ extras \ ssl
の内側に配置します。
ファイル mod_ssl.so
が C:\ wamp64 \ bin \ apache \ apache(version)\ modules
内にあることを確認してください。
Apacheディレクトリ C:\ wamp64 \ bin \ apache \ apache2.4.27 \ conf
内の httpd.conf
で mod_ssl
を有効にします。
php.ini
で php_openssl.dll
を有効にします。 私の問題は、2つのphp.iniファイルがあり、両方でこれを行う必要があることでした。 まず、WAMPタスクバーアイコンの内部に配置できます。
。。
もう1つは C:\ wamp64 \ bin \ php \ php(バージョン)
にあります。
両方の php.ini
ファイルの場所を見つけ、 curl.cainfo =
行を見つけて、このようなパスを指定します。
curl.cainfo = "C:\ wamp64 \ bin \ php \ php(Version)\ extras \ ssl \ cacert.pem"
。
ファイルを保存してサーバーを再起動すると、すぐに実行できます。
cartalyst/stripe]1で使用されているGuzzleは、サーバー証明書をチェックするための適切な証明書アーカイブを見つけるために以下のことを行います:
1.1.php.iniファイルにopenssl.cafile
が設定されているか確認します。
2.php.iniファイルにcurl.cainfo
が設定されているか確認する。
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パッケージによって提供される)。 5.usr/local/etc/openssl/cert.pem
が存在するか確認する (OS X; homebrewが提供)。
5.C:◆Windowssystem32◆curl-ca-bundle.crtが存在するか確認する(Windows) 5.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で示された場所にファイルを書き込んでみてください。
私がしたことは、 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)の場所にコピーし、それを取得することができました動作します。
これが私にとって唯一の解決策でした。
ある日、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にショットを当てて、接続しようとしている場所からの応答に何か問題があるかどうかを確認します。 たぶん問題は結局それほど「ローカル」ではないかもしれません。
すべての答えは正しいです。 しかし最も重要なことは正しいphp.iniファイルを見つける必要があることです。 このコマンドをcmd "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つずつ変更して確認することをお勧めします。 。
ウィンドウエクスプローラーで直接 php.ini
ファイルを開くようにしてください。 (私の場合: C:\ DevPrograms \ wamp64 \ bin \ php \ php5.6.25
)。
システムトレイのWamp / Xampアイコンのメニューで「php.ini」へのショートカットを使用しないでください。 この場合、このショートカットは機能しません。
次に、その php.ini
を編集します。
curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem"
と。
openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
php.ini
を保存した後、Wampアイコンで "すべてのサービスを再起動"したり、CMDを閉じたり再開したりする必要はありません。
「guzzlehttp / guzzle」コンポーザーパッケージを使用するLaravel 4 phpフレームワークで、これと同じ問題を経験しました。 どういうわけか、メールガンの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では)、GuzzleがcURLのデフォルトのSSL検証ロジックを使用するように構成され、問題が修正されました。
'verify' => true
SSL接続のセキュリティを気にしない場合は、これを「false」に設定することもできますが、それは良い解決策ではありません。
「ベンダー」のファイルは改ざんされることを意図していないため、より良い解決策はGuzzleクライアントを構成を使用することです。しかし、これはLaravel 4では行うのが難しすぎました。
これにより、他の誰かが数時間デバッグできるようになることを願っています。..
'var_dump(php_ini_loaded_file()); ''を実行するとき。 私のページでこの出力を取得します。
'C:\ Development \ bin \ apache \ apache2.4.33 \ bin \ php.ini '(length = 50)' `。
phpを取得して証明書ファイルをロードするには、このパス 'C:\ Development \ bin \ apache \ apache2.4.33 \ bin \ php.ini ''でphp.iniを編集する必要がありました。 [openssl.cafile = "C:/ Development / bin / php / php7.2.4 / extras / ssl / cacert.pem"
を追加して、https://curl.haxx.se / docs / caextract.html。
drupal 8、wamp、php7.2.4を使用して、Windows 10にいます。
私はこの問題を理解するのに時間をかけすぎました。
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以降では、デフォルトでシステム証明書が見つかります。 いつ。 //< 5.6、Guzzleバンドルcacertを使用します。
これはエッジケースかもしれませんが、私の場合、問題は client conf ( curl.cainfo
を php.ini
で構成していた)ではなく、リモートサーバーが正しく構成されていません。:
チェーンに中間 certs は送信されませんでした。 Chromeを使用してサイトを閲覧するエラーはありませんでしたが、PHPでは次のエラーが発生しました。
カールエラー60。
中間証明書をリモートWebサーバー構成に含めた後、動作しました。
このサイトを使用して、サーバーのSSL構成を確認できます。
Windowsをお使いなので、パスの区切り文字が '¬になっていると思います(Linuxでは '/')。
定数 DIRECTORY_SEPARATOR
を使ってみてください。あなたのコードはよりポータブルになるでしょう。
試してみてください:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');
EDIT: そしてフルパスを書いてください。相対パスでいくつか問題がありました(おそらくcurlは別のベース・ディレクトリから実行されるのでしょうか?)