AndroidでSSL/TLS通信が上手くいかなかったときの話
HTTPS のサイトを公開したら,パソコンでは保護された通信としてサイトが表示されるのに,Android スマホから見るとセキュリティ証明書に問題がありますという警告画面が出てきました.
元の設定内容
私の場合は,Apache と Let's Encrypt で生成した DV 証明書で.詳しくは以下の記事に書いている通りです.
調べた感じ,Nginx と Apache, またそのバージョンごと対策が異なるかもしれません.
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
今書いてある内容がこちらです.パソコンでは有効になります.
関係あるのかはわかりませんが,HTTPS になった辺りに Search Console で「セキュリティの問題」として有害なコンテンツ (悪意のあるコンテンツ) が検出されたという警告も来ていました.SSL/TLS の設定をミスっていたからなんでしょうか.
必要な証明書の違い
証明書には 4 種類あります.(括弧内は Let's Encrypt での証明書の名称)
- サーバ証明書 (cert.pem)
- 中間証明書 (chain.pem)
- サーバ証明書 + 中間証明書 (fullchain.pem)
- 秘密鍵 (privkey.pem)
Apache 2.4.8 以降,もしくは Nginx の場合はサーバ証明書 + 中間証明書で認証することができます.Apache 2.4.8 未満であればサーバ証明書と中間証明書で認証します.
Let's Encrypt でいう fullchain.pem を使うときはサーバ証明書として指定するっぽい (?) です.
ここでもうお気づきかもしれませんが,先ほどの設定にはサーバ証明書しか記載していません.これでパソコンでは SSL/TLS 通信ができていたので気に留めていませんでしたが.
Android では中間証明書も必要
つまり,パソコンではサーバ証明書と秘密鍵があれば SSL/TLS 通信が可能でしたが,Android では中間証明書も示す必要があるようです.
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
よって,このように追加したところ上手くいきました!