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
に格納されている。
/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
も存在する。項目名の通り,証明書ファイルが格納されているディレクトリーを指定する設定となっている。
ただし,この設定は証明書ごとにファイル分割したものの格納場所となっている。例えば,Debian系OSで/etc/ssl/certs/
を確認すると,[f30dd6ad.0
] のようなファイルが大量に配置されている。
cURLのサイトで配布されているpemファイルは複数の証明書を含んでいる。capathを指定したい場合,pemファイルの内容を証明書ごとに [ハッシュ.0
] のファイルに分割する必要がある。
少々手間なので,今回は素直にopenssl.cafile
を使うことにした。
結論
今まで得体の知れなかった/etc/ssl/certs/ca-certificates.crt
を自前で用意することができた。
一番最初にこのファイルを参照した「peclでのインストール失敗への対応」の段階で後々自前で用意しないと問題になるだろうとは思っていたので,今回対応できてよかった。
一つずつわからないことを解消していきたい。