MoyaSystem

もやしです。

PHPでhttpsにcurlが使えなくて詰まった話

PHPcurlを叩きたくて、こんなコードを書いて動かしてみた。

    $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);

を追加することで無事動きました!