SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】curlでSSL通信をCA証明書のチェックありで

問題

curlでhttps://~のURLにアクセスしたら、curl_error()でこんなエラーが出てました。

SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

ソースはこんな感じ。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.softel.co.jp/');
curl_exec($ch);
curl_close($ch);

curl

答え

CURLOPT_SSL_VERIFYPEER が、デフォルトでtrueなので、サーバー証明書の検証をしようとするのだが、証明書がないと検証できなくてエラーとなる。


対応1

CURLOPT_SSL_VERIFYPEER を falseにすれば、検証はしない。エラーも出ない。


対応2

CURLOPT_CAINFO で、CA証明書を指定する。更新などのメンテナンスで多少手間がかかるけど、検証しないよりはこちらの方が望ましい対応なのでしょう。

証明書はこちら(Automatically converted CA Certs from mozilla.org)などからいただいてくることができる。

参考: 2012年12月時点のcacert.pem

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.softel.co.jp/');
curl_setopt($ch, CURLOPT_URL, '/path/to/cacert.pem');
curl_exec($ch);
curl_close($ch);

特定のWebサイト用ならば、firefoxでアクセスして、「証明書パスを含む X.509 証明書(PEM)」の形式でエクスポートした証明書を使ってもよいらしい。


対応3

これは環境に依存する問題で、curlのコンパイルのオプションなどで何とかなるらしい。

関連するメモ

コメント