PHPの curl 関数でhttpsのウェブページが取得できなかった

久しぶりにスクレイピングでもするかと思い Windows10のPCに PHP 7.4 を入れた。


curl関数でウェブページを取得しようとしたらできない。
ステータスコードが 0 になっている。
どうもhttps がダメ、http はできた。
openssl拡張は有効にしている。


curl_getinfo()で情報を見たら ssl_verify_result に番号が入っている。

[ssl_verify_result] => 20

https://www.php.net/manual/ja/function.curl-getinfo.php#111678に意味が書いてあった。

20: unable to get local issuer certificate

ローカルのルート証明書が取得できないとかそういう話かな?

以前、同じようなことがあって CURLOPT_SSL_VERIFYPEER を false にして乗り切った事例を思い出したが、証明書を検証しないのもいかがなものか? と思った。


「unable to get local issuer certificate」でぐぐったりして、こちらの記事にたどり着いた。
php cURLを使う時、CA証明書が必須になってる


curl - Extract CA Certs from Mozilla から cacert.pem をダウンロードして、
php.ini の openssl.cafile で cacert.pem のパスを指定してあげればよいことがわかった。

cacert.pem = "cacert.pemのパス"

追加で試して以下のことがわかった。

openssl.cafile の代わりに curl.cainfo でもよい。

curl.cainfo =  "cacert.pemのパス"

実行時に curl_setopt で指定もできる。

curl_setopt($ch, CURLOPT_CAINFO , 'cacert.pemのパス');