【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);
答え
CURLOPT_SSL_VERIFYPEER が、デフォルトでtrueなので、サーバー証明書の検証をしようとするのだが、証明書がないと検証できなくてエラーとなる。
対応1
CURLOPT_SSL_VERIFYPEER を falseにすれば、検証はしない。エラーも出ない。
対応2
CURLOPT_CAINFO で、CA証明書を指定する。更新などのメンテナンスで多少手間がかかるけど、検証しないよりはこちらの方が望ましい対応なのでしょう。
証明書はこちら(Automatically converted CA Certs from mozilla.org)などからいただいてくることができる。
$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のコンパイルのオプションなどで何とかなるらしい。
コメント