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

導入

PEAR/PECLに最低限必要なphp.iniの設定」でPEAR/PECLの設定について書いた。この中で,php.iniopenssl.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やレンタルサーバーなどで/etc配下を参照できない場合,この証明書ファイルを参照できない。そこで,この証明書ファイルの入手方法が問題になる。

方法

探したところ,「PHP: SSL context options – Manual」で gabri dot ns at gmail dot comがcURLの「curl – Extract CA Certs from Mozilla」で配布されている証明書ファイルをダウンロードして使っているとコメントしている。

該当ページを確認すると,Mozillaが公開しているファイルをPEM形式で整形して配布しているようだ。インターネット上で使われる約140の証明書が格納されているらしい。

今回は以下のコマンドで$HOME/.local/sslにこのファイルをダウンロードする。

mkdir -p ~/.local/etc/ssl
cd ~/.local/etc/ssl
wget https://curl.haxx.se/ca/cacert.pem

そして,php.iniには以下のようにダウンロードしたファイルを指定する。

extension = openssl
openssl.cafile = ${HOME}/.local/etc/ssl/cacert.pem

これで自前の証明書でSSL通信が可能になる。

なお,php.iniで指定できる証明書ファイル関係の設定には,openssl.cafileの他に,openssl.capathも存在する。項目名の通り,証明書ファイルが格納されているディレクトリーを指定する設定となっている。

openssl.capath string
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.
PHP: Runtime Configuration – Manual

ただし,この設定は証明書ごとにファイル分割したものの格納場所となっている。例えば,Debian系OSで/etc/ssl/certs/を確認すると,[f30dd6ad.0] のようなファイルが大量に配置されている。

cURLのサイトで配布されているpemファイルは複数の証明書を含んでいる。capathを指定したい場合,pemファイルの内容を証明書ごとに [ハッシュ.0] のファイルに分割する必要がある。

少々手間なので,今回は素直にopenssl.cafileを使うことにした。

結論

今まで得体の知れなかった/etc/ssl/certs/ca-certificates.crtを自前で用意することができた。

一番最初にこのファイルを参照した「peclでのインストール失敗への対応」の段階で後々自前で用意しないと問題になるだろうとは思っていたので,今回対応できてよかった。

一つずつわからないことを解消していきたい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です