現在運営中のサイトで、一部の端末からのみSSLの証明書エラーが出て、サイトにアクセスできないという問題が発生していた。当初は、アクセスできない端末が決まって、OSのアップデートをしばらくしていないだとか、ブラウザのアップデートをしていない+サポートが終了している端末とかだったので、アップデートしていないのと端末が古いせいだと思い込んでいた。
しかし、以下のサイト(https://www.ssllabs.com/ssltest/)で調べてみると、This server's certificate chain is incomplete. Grade capped to B.
という警告が出ていた。
Nginxの設定を見直すと、ssl_certificate /etc/letsencrypt/live/[your host]/cert.pem;
となっていた。
この辺は、手探りでサーバをセットアップしていたので、よくわからないままWeb上の記事からコピペしていたのがまずかったようで、改めて調べてみると…
- cert.pem(サーバ証明書)
- chain.pem(中間証明書)
- fullchain.pem(サーバ証明書+中間証明書)
- privkey.pem(秘密鍵)
という内訳になっていた。cert.pem
はサーバ証明書だけなので、中間証明書がなくてルート証明書まで辿れず、エラーとなっていたようだ。
これを、以下のように設定し直すと無事、エラーは解消された。
#ssl_certificate /etc/letsencrypt/live/[your host]/cert.pem; # これが大問題
ssl_certificate /etc/letsencrypt/live/[your host]/fullchain.pem; # こっちが正解
ssl_certificate_key /etc/letsencrypt/[your host]/privkey.pem;
で、何故一部の端末でしか証明書エラーが出なかったのか、気になって調べてみると。
- ブラウザが勝手に中間証明書を探してくれていた
- ブラウザのキャッシュに必要な中間証明書がたまたま残っていた
という感じの理由のようだ。