PHPでhttpsにcurlが使えなくて詰まった話
PHPでcurlを叩きたくて、こんなコードを書いて動かしてみた。
$curlObj = curl_init(); $c_opt = array(CURLOPT_URL => 'https://hogehoge.com', CURLOPT_COOKIEJAR => 'cookie.txt', CURLOPT_COOKIEFILE => 'cookie.txt', CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => "login=".$username."&password=".$password, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_TIMEOUT => 60); curl_setopt_array($curlObj, $c_opt); $session = curl_exec($curlObj);
コマンドラインで叩くと動くのに、PHPだとうまくいかない。$sessionがからっぽのままのようだ。
何が原因でコケているのか調べるために curl_error($curlObj) を動かしてみた。すると案の定エラーが吐かれている。
self signed certificate in certificate chain
自分で証明した証明書(オレオレ証明書)が使われていますよとのことらしい。調べてみるとこんな記述を見つけた。
Try setting curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
https://groups.google.com/d/msg/instagram-api-developers/pHN6RqLYtZI/RLCnr8yzyKsJ
CURLOPT_SSL_VERIFYPEER オプションについての説明はこれ。
FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
http://php.net/manual/ja/function.curl-setopt.php
curl_init()直後に
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
を追加することで無事動きました!