【Nginx・SSL】一部端末で証明書エラーが発生する問題

2022年7月9日

現在運営中のサイトで、一部の端末からのみ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;

で、何故一部の端末でしか証明書エラーが出なかったのか、気になって調べてみると。

  • ブラウザが勝手に中間証明書を探してくれていた
  • ブラウザのキャッシュに必要な中間証明書がたまたま残っていた

という感じの理由のようだ。