Apache再起動時のエラー「Init: Unable to read server certificate from file」の原因と解決方法
SSLの更新を行うために、SSLの証明書ファイルをサーバにアップロードしてApacheを再起動すると、以下のようなエラーが表示されてApacheの再起動に失敗し、Apacheが停止してしまうことがある。
[error] Init: Unable to read server certificate from file /etc/pki/tls/certs/localhost.crt
[error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
「Unable to read server certificate from file /etc/pki/tls/certs/localhost.crt」というエラーメッセージは、「/etc/pki/tls/certs/localhost.crtというファイルからは、サーバ証明書(server certificate)を読み取れません」という意味なので、サーバ証明書ファイルに何らかの問題があると考えることができる。
このエラーの原因は、サーバ証明書ファイルの「文字コード」に問題がある可能性が高い。
文字コードに原因がある場合は、Apacheが読める文字コード(UTF-8)に変換すれば問題を解決できる。
例えば、サーバ証明書ファイルの文字コードをUTF-8でアップロードしたつもりが、よくよく確認してみると、何故か「unicode」だったりすると、apacheからはサーバ証明書を読めない(Unable to read server certificate)から、このようなエラーになってしまう。
サーバに証明書ファイルをアップロードする前に、Windows PCのサクラエディタなどのテキストエディタでサーバ証明書ファイルの文字コードをUTF-8に変更したつもりが、誤ってunicodeに変更してしまった、ということは世間的によくあることなのかどうか分からないが、私は1年に1回ぐらいの頻度でやってしまっているような気がする。
こういったミスはつらい。
Linuxでcatコマンドで見ていると普通に証明書ファイルが文字化けもせず綺麗に見えていることがまたハマる原因。
viコマンドで見ると、きちんと文字化けしていることが分かる。
文字化けファイルには、やたらと@マークが多かった……。
Windows PCでサーバ証明書ファイルの文字コードをUTF-8に変換してアップロードしたら、あっさりと問題は解決した。
文字コードに気をつけなくては……。
たぶん、多くの人は、文字コードよりも、改行コードに気を付けていると思う。
サーバ証明書の改行コードはLinuxの改行コード「LF」にしておいた方がよい。
私が試したところ、「CRLF」のままでも動くことは動くようだったが、動かない場合もあるかもしれないことと、気持ちが悪いと思うので、「LF」にしておいた方がよい。
まとめると、SSLサーバ証明書ファイルをアップロードする際には、
- 文字コードがUTF-8であること
- 改行コードがLFであること
の2点に注意しなくてはいけない、と思う。