‘cURL error 60’エラーが出たときの対処法 ‘cURL error 60: SSL certificate problem: unable to get local issuer certificate’

cURLを使用したプログラムでhttpsのサイトにアクセスしたとき、下記の例外が発生しました。
この問題を解消するために、調べた事・行ったことののメモを書いておきます。

環境: Windows10, PHP7.0.14, GuzzleHttp経由でcURLライブラリを利用

Fatal error: 
Uncaught exception 'GuzzleHttp\Exception\RequestException' with message 
'cURL error 60: SSL certificate problem: 
  unable to get local issuer certificate

エラーの理由


このエラーは、SSL暗号化されているhttpsのサイトにアクセスしようとした際にそのサーバが信頼できるか否かの証明書(ca証明書)が取得できなかった時に発生します。

行ったこと


  • SSLの認証情報をファイルに保存する
    下記のURLの出力結果をダウンロードし、適当なファイルにに保存します。
    今回は、C:\path\to\cacert.pemに保存したものとして説明します。
    http://curl.haxx.se/ca/cacert.pem

  • php.iniを書き換える
    curlのセクションに、コメントアウトされたcurl.cainf定義があるので、ここに先ほどのファイルを指定します


[curl]
curl.cainfo = "C:\path\to\cacert.pem"

  • php.iniを書き換えたくない/変更できない場合
    phpプログラム上に以下のような形で証明書ファイルの場所を指定しても大丈夫です。

$http = new GuzzleHttp\Client([
    'verify' => 'c:\path\to\cacert.pem'
];

Google Client SDKを使っているときにこのエラーが出たときは…


Google Client SDKを使っているときは、先ほど作った$httpを下記の形で指定できるらしいです。
(実際に使っていないので未検証の情報です)

$google = new Google_Client;
$google->setHttpClient($http);

参考:StackOverflow.comでの情報


StackOverflow.comによると、上記の処理を行ったにもかかわらず、エラーが解消されない場合は下記のチェックを行うとよいそうです。
http://stackoverflow.com/questions/29822686/curl-error-60-ssl-certificate-unable-to-get-local-issuer-certificate

php.iniファイルにopenssl.cafileのパラメータが指定されているか
php.iniファイルにcurl.cainfoのパラメータが指定されているか

Red Hat, CentOS, Fedoraを使っている場合...
  /etc/pki/tls/certs/ca-bundle.crtがあれば
  このファイルを見に行くので、ファイルが存在しているか確認する。

Ubuntu, Debianを使っている場合...
  /etc/ssl/certs/ca-certificates.crtがあればこのファイルを見に行くので...(以下同様)

FreeBSDの場合
  /usr/local/share/certs/ca-root-nss.crtがあれば...

OS Xの場合
  /usr/local/etc/openssl/cert.pemがあれば...

Windowsの場合
  C:\windows\system32\curl-ca-bundle.crt があれば...
  C:\windows\curl-ca-bundle.crt があれば...

php.iniファイルにopenssl.cafileやcurl.cainfoのパラメータが正しくセットできているかは、下記のプログラムで確認できます。一台のPCに複数バージョンのPHPがインストールされている場合は、念のために確認しておいた方が良いです。

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

関連記事

2 Responses to “‘cURL error 60’エラーが出たときの対処法 ‘cURL error 60: SSL certificate problem: unable to get local issuer certificate’”

  1. Revin より:

    こんにちは。
    「Google Client SDKを使っているときにこのエラーが出たときは…」の節での方法ですが、実践してみたところ、できました。
    一応、報告させていただきます。

    https://qiita.com/rev84/items/729167a5b5ba36bf262b

  2. […] 参考:http://nanoappli.com/blog/archives/7992 […]

Revin へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。