Composer で curl のエラー 77

2021-07-14
PHP
Composer
curl

小話です。
phpenv でインストールした composer が curl のエラーを吐いていた。

1
2
[Composer\Downloader\TransportException]
curl error 77 while downloading https://repo.packagist.org/p2/phpunit/phpunit.json: Problem with the SSL CA cert (path? access rights?)

解決策

気の短い人は、下記の手順を参照。要するに libcurl-nss-dev だとコンパイルは通るけど curl 系の関数が TLS での接続でエラーを出してしまう。なので、 libcurl-openssl-dev をインストールして、PHP をコンパイルし直せばOK

細かいバージョン番号とか、パッケージ名はそれぞれのディストリビューションに合わせてください。

1
2
3
4
$ phpenv uninstall 8.0.3
$ sudo apt remove libcurl3-nss
$ sudo apt install libcurl4-openssl-dev
$ phpenv install 8.0.3

解決に至るまでのデバッグ

composer の verbose 出力

1
$ composer -vvv self-update

verbose だけど、PHPの stacktorace がいっぱい出ただけなので原因が分からなかった。

curl のサンプルコードを書いてデバッグ

CURLOPT_VERBOSE がポイント。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://getcomposer.org/versions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);

$output = curl_exec($ch);

if(curl_errno($ch))
{
$error = curl_strerror(curl_errno($ch));
echo 'Curl error: ' . $error;
}
curl_close($ch);

これを実行すると、下記のような curl の詳細なエラー出力がでるので、問題がすぐわかりました。

1
2
3
4
5
6
7
8
9
10
11
12
$ php test.php
* Trying 54.36.53.46:443...
* TCP_NODELAY set
* Trying 2001:41d0:302:1100::8:104f:443...
* TCP_NODELAY set
* Immediate connect fail for 2001:41d0:302:1100::8:104f: Network is unreachable
* Connected to getcomposer.org (54.36.53.46) port 443 (#0)
* Initializing NSS with certpath: none
* WARNING: failed to load NSS PEM library libnsspem.so. Using OpenSSL PEM certificates will not work.
* CAfile: none
CApath: none
* loaded libnssckbi.so

WARNING のところに書いてありますが、 libnsspem.so を使う場合は、OpenSSL の PEM certificates は動かないよと書いてあります。

nssで動かないなら、configure でコケてくれよという気もする。