事件発生
ある日サーバーにブラウザからアクセスすると
「このサイトは安全に接続できません
your.domain.to ではサポートされていないプロトコルが使用されています。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH」
という表示がでて、接続されなくなっていました。(多少の文言の違いはあります)
インターネットで調べた結果、どうもこのエラーはSSLサーバー証明書回りのエラーらしいのでサーバーにログインして確認することに。
証明書の動作確認
そもそも証明書が動作しているかどうかを手で叩いて確認してみることにした。
opensslコマンドには s_client というモードがあり、ssl通信の疎通確認だけではなく、クライアント証明書と秘密鍵を指定できたり、証明書チェーンを表示できたいとかなりの便利コード。らしい。
とりあえずプレーンなまま確認してみる。
# openssl s_client -connect your.domain.to
socket: Connection refused
connect:errno=111
エラーが返ってきた。
概要にすると「サーバーが開いてない」とのこと。
え? サーバー?
サーバーの動作確認
使っているHTTPサーバーはApacheだ。
そのためhttpdのサービス動作状況を確認してみた。
# service httpd states
httpd is stopped
と、止まってる・・・
# service httpd start
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:443
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:443
no listening sockets available, shutting down
Unable to open logs
[FAILED]
ところが、開始しようとすると443ポートはすでに利用されているため出来ないと言われてしまった。
ポートの動作状況を見てみる。
# /usr/sbin/lsof -i | grep http
letsencry 21321 root ~略~ TCP *:https (LISTEN)
letsencryとかいうのが利用している。
突然だが、サーバーの証明書はLet's Encryptを利用している。
この証明書は期限が非常に短く、細かいスパンで証明書を更新しなければならないため自動で証明書を更新するbotのようなものも存在している。
それがこれ。らしい(サーバーを建てた人に聞いた)
本来は深夜にこっそりと動作しているはずのそれが、何らかの原因で昼間にもhttpdの利用しているポートを専有してしまっているのが問題らしい。
強制終了してしまおう。
# kill -9 21321
# service httpd start
Starting httpd: [ OK ]
問題なく起動した。
しかし、このままでは証明書が切れて結局再びエラーが出てしまうので、すでに用意されていた証明書を更新するボットを動かし、httpdを再起動したら完了だ。
結論
SSLそのものよりも、サーバー自体がきちんと動作をしているか確認すべし。
お粗末さまでした。