SSL対応のサイトを別サーバに移転することになったのですが、SSLの設定ではまったので記録しておきます。
Apache2.4.8以降では、中間証明書の扱いが変わったようです。
2.4.7までは中間証明書は SSLCertificateChainFile ディレクティブで指定していました。
SSLCertificateChainFile /etc/httpd/conf/ssl.crt/dvcacert.cer
Apache2.4.8以降では、以下のようにエラーとなってしまいます。SSLCertificateChainFile ディレクティブがなくなったようです。
そのかわり、SSLCertificateFileディレクティブで指定するように言われます。
$ sudo /etc/init.d/httpd configtest
AH02559: The SSLCertificateChainFile directive (/etc/httpd/conf.d/ssl.conf:122) is deprecated, SSLCertificateFile should be used instead
Syntax OK
具体的な方法をいろいろ探しましたが、以下のURLに記載のスクリプトで形式を変換して、サーバー証明書と中間証明書を結合したものをSSLCertificateFileディレクティブで指定するとよいようです。
bundle_ssl.sh
#!/bin/sh
#
# Convert PEM Certificate to ca-bundle.crt format
#
test ! $1 && printf "Usage: `basename $0` certificate" && exit 1
# Friendly Name and Underline Friendly Name with equal signs
openssl x509 -in $1 -text -noout | sed -e 's/^ *Subject:.*CN=\([^,]*\).*/\1/p;t c' -e 'd;:c' -e 's/./=/g'
# Output Fingerprint and swap = for :
openssl x509 -in $1 -noout -fingerprint | sed -e 's/=/: /'
# Output PEM Data:
echo 'PEM Data:'
# Output Certificate
openssl x509 -in $1
# Output Certificate text swapping Certificate with Certificate Ingredients
openssl x509 -in $1 -text -noout | sed -e 's/^Certificate:/Certificate Ingredients:/'
変換シェルを実行して、証明書を連結します。
# bundle_ssl.sh /etc/httpd/conf/ssl.crt/xxx.xxx.com.crt > xxx.xxx.com_chain.crt
# bundle_ssl.sh /etc/httpd/conf/ssl.crt/dvcacert.cer >> xxx.xxx.com_chain.crt
/etc/httpd/conf.d/ssl.conf の該当箇所を以下のように書き換えます。
#SSLCertificateFile /etc/httpd/conf/ssl.crt/xxx.xxx.com.crt
SSLCertificateFile /etc/httpd/conf/ssl.crt/xxx.xxx.com_chain.crt
#SSLCertificateChainFile /etc/httpd/conf/ssl.crt/dvcacert.cer
エラーは出なくなります。
$ sudo /etc/init.d/httpd configtest
Syntax OK
以下は、SSLCertificateChainFile ディレクティブがなくなったこととは関係ないエラーですが、記録しておきます。
上記設定で起動したところ、まだ以下のエラーログの内容を吐き出して失敗しました。
[Wed Feb 18 14:24:10.194548 2015] [ssl:emerg] [pid 7602] AH02580: Init: Pass phrase incorrect for key xxx.xxx.com:443:0
[Wed Feb 18 14:24:10.194575 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Wed Feb 18 14:24:10.194584 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error
[Wed Feb 18 14:24:10.194591 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Wed Feb 18 14:24:10.194598 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error (Type=RSA)
[Wed Feb 18 14:24:10.194633 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib
[Wed Feb 18 14:24:10.194643 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Wed Feb 18 14:24:10.194650 2015] [ssl:emerg] [pid 7602] SSL Library Error: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error (Type=PKCS8_PRIV_KEY_INFO)
[Wed Feb 18 14:24:10.194659 2015] [ssl:emerg] [pid 7602] AH02564: Failed to configure encrypted (?) private key xxx.xxx.com:443:0, check /etc/httpd/conf/ssl.key/xxx.xxx.com.key
「SSLPassPhraseDialog exec:」で指定しているパスワードファイルの移行を忘れていました。
パスワードファイルを持ってきて、実行権限を与え、ssl.conf に以下の編集をして起動したところ、正常に起動できました。
#SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLPassPhraseDialog exec:/usr/local/bin/ssl_pp_filter.sh
ssl_pp_filter.sh の中身は下記のようにパスフレーズを echo するだけのものです。
#!/bin/sh
echo "パスフレーズ"