久しぶりにスクレイピングでもするかと思い 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のパス');