私は地元の開発環境でWAMPを使用しており、クレジットカードに請求しようとしていますが、エラーメッセージが表示されます。
cURLエラー60:SSL証明書の問題:ローカル発行者証明書を取得できません
私はグーグルで多くのことを調べました、そして、私はこのファイルをダウンロードすることを提案しています: cacert.pem 、どこかに置いて私のphp.iniでそれを参照してください。これは私のphp.iniの一部です。
curl.cainfo = "C:\Windows\cacert.pem"
それでも、サーバを数回再起動してパスを変更した後でも、同じエラーメッセージが表示されます。
私はApacheモジュールのWAMPを使い、ssl_moduleを有効にしています。そしてPGP拡張から私は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 Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
問題が解決しました!
GuzzleでPHP 5.6を使用している場合、Guzzleはプロセスではなく証明書にPHPライブラリの自動検出を使用するように切り替えました( ref )。 PHPは変更の概要を示します ここ 。
PHPが使用している場所をダンプすることができます。
var_dump(openssl_get_cert_locations());
OS Xのテストでは、自作を使用してopenssl brew install openssl
をインストールしてから、php.iniまたはZend Serverの設定でopenssl.cafile=/usr/local/etc/openssl/cert.pem
を使用することができます(OpenSSLの下)。
証明書バンドルはcurl/Mozillaのcurl Webサイトからも入手できます。 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ユーザー。私は間違ったphp.iniファイルを編集していたので、問題はWAMPユーザー向けではなくXAMPP向けではなかったため、この問題は何時間も続き、正しい答えでもありませんでした。
これが私がしたことです
C:\wamp64\bin\php\your php version\extras\ssl
の中に入れてください
ファイルmod_ssl.so
がC:\wamp64\bin\Apache\apache(version)\modules
の内側にあることを確認してください
Apacheディレクトリmod_ssl
内のhttpd.conf
でC:\wamp64\bin\Apache\apache2.4.27\conf
を有効にします。
php_openssl.dll
でphp.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"
それではファイルを保存してサーバーを再起動してください。
cartalyst/stripe によって使用されるGuzzleは、サーバ証明書を照合するために適切な証明書アーカイブを見つけるために次のことを行います。
openssl.cafile
が設定されているか確認してください。curl.cainfo
が設定されているか確認してください。/etc/pki/tls/certs/ca-bundle.crt
が存在するかどうかを確認してください(Red Hat、CentOS、Fedora、ca-certificatesパッケージで提供)/etc/ssl/certs/ca-certificates.crt
が存在するか確認してください(Ubuntu、Debian、ca-certificatesパッケージで提供されます)/usr/local/share/certs/ca-root-nss.crt
が存在するかどうか確認してください(FreeBSD、ca_root_nssパッケージによって提供されます)/usr/local/etc/openssl/cert.pem
かどうかを確認します(OS X、自作製)。C:\windows\system32\curl-ca-bundle.crt
が存在するか確認してください(Windows)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で示される場所にファイルを書き込もうとします。
Php.iniを変更できない場合は、次のようなコードからcacert.pemファイルを指すこともできます。
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
私がしたことはどんなphpスクリプトでもvar_dump(openssl_get_cert_locations()); die;
を使うことでした。それは私のローカル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)にコピーしてそれを働かせることができます。
これが私にとって唯一の解決策でした。
私は私のために働いた解決策を見つけました。私は最新のゲームからバージョン4.0にダウングレードしましたが、うまくいきました。
Composer.jsonに "guzzlehttp/guzzle"を追加してください: "〜4.0"
誰かに役立つことを願っています
私は、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
ファイルをウィンドウエクスプローラで直接開いてください。 (私の場合は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アイコンで "Restart All Services"を実行したり、CMDを閉じたり再度開いたりする必要はありません。
私はguzzlehttp/guzzle
作曲家パッケージを使う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上で)変更すると、GuzzleはcURLのデフォルトのSSL検証ロジックを使用するように設定され、私の問題が修正されました。
'verify' => true
SSL接続のセキュリティを気にしないのであれば、これをfalse
に設定することもできますが、それは良い解決策ではありません。
vendor
の中のファイルは改ざんされることを意図していないので、より良い解決策は Guzzleクライアントの設定 を使うことですが、これはLaravel 4でやるのは非常に困難でした。
これが他の誰かに数時間のデバッグを節約することを願っています...
これはEdgeのケースかもしれませんが、私の場合は問題はclient conf(すでにcurl.cainfo
で設定されたphp.ini
)ではなく、むしろリモートではサーバーが正しく構成されていません。
チェーン内の中間certsは送信されませんでした。 Chromeを使用してサイトを閲覧する際にエラーは発生しませんでしたが、PHPを使用すると、以下のエラーが発生しました。
cURLエラー60
リモートWebサーバの設定にIntermediate Certsを含めた後はうまくいきました。
このサイトを使用してサーバーのSSL構成を確認できます。
私はこの問題を理解するのにあまりにも多くの時間を費やしました。
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.
答えはすべて正しいです。 しかし最も重要なこと あなたは正しい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つずつ変更して確認することをお勧めします。 *
やってみました..
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
信頼できる情報源を消費しているのであれば、おそらくSSL証明書を検証する必要はありません。
'var_dump(php_ini_loaded_file());'
を実行すると、この出力が自分のページに表示されます'C:\Development\bin\Apache\apache2.4.33\bin\php.ini' (length=50)'
phpにcertファイルをロードさせるには、このパスの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からcertファイルを配置する必要がありました。 html
drupal 8、wamp、php7.2.4を使ってwindows 10上にいます