PHPのSSL通信に必要な証明書ファイルの入手方法

導入
「PEAR/PECLに最低限必要なphp.iniの設定」でPEAR/PECLの設定について書いた。この中で,php.ini
にopenssl.cafile = /etc/ssl/certs/ca-certificates.crt
を指定していた。
extension = openssl
openssl.cafile = /etc/ssl/certs/ca-certificates.crt
openssl.cafile
では公開鍵暗号方式の認証局 (Certificate Agent) の公開鍵の証明書ファイルを指定している。UbuntuなどのDebian系のLinuxであれば/etc/ssl/certs/ca-certificates.crt
に格納されている。
しかし,Debian系以外のOSやレンタルサーバーなどで 探したところ,「PHP: SSL context options – Manual」で gabri dot ns at gmail dot comがcURLの「curl – Extract CA Certs from Mozilla」で配布されている証明書ファイルをダウンロードして使っているとコメントしている。 該当ページを確認すると,Mozillaが公開しているファイルをPEM形式で整形して配布しているようだ。インターネット上で使われる約140の証明書が格納されているらしい。 今回は以下のコマンドで そして, これで自前の証明書でSSL通信が可能になる。 なお, openssl.capath string ただし,この設定は証明書ごとにファイル分割したものの格納場所となっている。例えば,Debian系OSで cURLのサイトで配布されているpemファイルは複数の証明書を含んでいる。capathを指定したい場合,pemファイルの内容を証明書ごとに [ 少々手間なので,今回は素直に 今まで得体の知れなかった 一番最初にこのファイルを参照した「peclでのインストール失敗への対応」の段階で後々自前で用意しないと問題になるだろうとは思っていたので,今回対応できてよかった。 一つずつわからないことを解消していきたい。/etc
配下を参照できない場合,この証明書ファイルを参照できない。そこで,この証明書ファイルの入手方法が問題になる。
方法
$HOME/.local/ssl
にこのファイルをダウンロードする。mkdir -p ~/.local/etc/ssl
cd ~/.local/etc/ssl
wget https://curl.haxx.se/ca/cacert.pemphp.ini
には以下のようにダウンロードしたファイルを指定する。extension = openssl
openssl.cafile = ${HOME}/.local/etc/ssl/cacert.pem
php.ini
で指定できる証明書ファイル関係の設定には,openssl.cafile
の他に,openssl.capath
も存在する。項目名の通り,証明書ファイルが格納されているディレクトリーを指定する設定となっている。
If cafile is not specified or if the certificate is not found there,
the directory pointed to by capath is searched for a suitable
certificate. capath must be a correctly hashed certificate directory./etc/ssl/certs/
を確認すると,[f30dd6ad.0
] のようなファイルが大量に配置されている。ハッシュ.0
] のファイルに分割する必要がある。openssl.cafile
を使うことにした。結論
/etc/ssl/certs/ca-certificates.crt
を自前で用意することができた。