TL; DR
- Apache 2.4.8 以降と以前で中間CA証明書の設置方法が違う
- 古いApacheの場合、中間CA証明書は
SSLCertificateChainFile
で指定しないとダメ- (2.4.8以降と同様に)
SSLCertificateFile
に連結していても読み込まれない
- (2.4.8以降と同様に)
はじめに
中間CA証明書の設定は、例えうまく設定されていなくてもブラウザによってはきちんと表示されるので見落としがちな問題である。
しかし、スマートフォンからの通信や、Facebook などのサイトでシェアする場合の OGP タグ情報の読み込みなどを行う場合、中間CA証明書が正常にインストールされていないとうまく通信ができない。
そこで何が起きてるのかを調べると初めて知ったことがあったので記載。
中間CA証明書ファイルの配置方法
Apache・nginx ともに以下のコマンドで中間CA証明書を含んだ1ファイルを参照する記載が多かったです。
# ミドルウェアから ssl.crt を証明書として参照する
$ cat [ssl証明書] [CA中間証明書] > ssl.crt
$ cat ssl.crt
-----BEGIN CERTIFICATE-----
(SSL証明書)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(中間CA証明書)
-----END CERTIFICATE-----
しかし、Apache 2.4.8 以前では中間CA証明書を指定するディレクティブとして SSLCertificateChainFile
が存在し、これで中間CA証明書ファイルを指定してあげる必要がありました。 2014年ぐらいの変更ですので、SSL証明局のページでも説明が併記してあることもあります。
最初、既存の設定ファイルを見たときには「古い中間CA証明書ファイルの指定方法は消えたけれど、SSLCertificateFile
で指定しているファイル内に中間CA証明書は書かれているので、中間CA証明書は有効になっているだろう」と考えていたのですが、これが大間違いでした。
古いバージョン ( SSLCertificateChainFile
ディレクティブが有効なバージョン) のApacheでは このディレクティブで指定しない限り中間CA証明書は有効になりません 。 なお、中間CA証明書を併記した crt ファイルは中間CA証明書を含まないSSL証明書として正常に認識されます。
まとめ
古い Apache が動いているサーバーに対する curl -I https://...
が失敗する場合は、このあたりの設定が古い Apache ベースのものになっているかを確認するようにしましょう。
私がSSL周りをやり始めたのが 2014年以降なので、このあたりの勘違いを起こしたというのはあります。
ミドルウェア | バージョン | SSL証明書指定 | 中間CA証明書指定 |
---|---|---|---|
Apache | 2.4.8 以降 | SSLCertificateFile $(cat [SSL証明書] [中間CA証明書]) |
不要 (SSL証明書指定に含まれる) |
Apache | 2.4.8 以前 | SSLCertificateFile [SSL証明書] |
SSLCertificateChainFile [中間CA証明書] |
nginx | (指定なし) | ssl_certificate $(cat [SSL証明書] [中間CA証明書]) |
不要 (SSL証明書指定に含まれる) |