システムの運用で、1年ごとに SSL サーバ証明書の入れ替え作業が発生することがあります。
システムを運用する立場からすると、「1年ごと」ではなく「3年ごと」もしくは「5年ごと」だと作業の負担が減りますが、年々 SSL/TLS の攻撃レベルは上がり、一昔前のセキュリティではあっという間にクラッキングされるリスクがあります。
そのため、面倒でも「1年ごと」に SSL 証明書の更新作業が必要になります。
最近他のエンジニアと会話をしている際に以下の質問というか疑問が上がりました。
「SSL サーバ証明書を入れ替える時って、セッションは切れますか?例えば、ログインしているユーザーさんがいた場合、SSL サーバ証明書を入れ替えることで、再度ログイン画面に戻るとか」
個人的にはファイアウォールやロードバランサなどで長時間操作がない時に「セッションタイムアウト」でセッションを強制的に切ることがあります。
理由は、長時間、セッションが解放されたままだとセキュリティのリスクが増すからです。
ファイアウォールで強制的にセッションタイムアウトされた場合は、再度ブラウザを操作するとログイン画面に戻ります。
しかし、「SSL サーバ証明書を入れ替えただけでは強制的にセッションを切られることはないのでは?」と思いましたが、確信は持てなかったので調査してみました。
セッションとは
言葉の定義から。
- session ← 委員会、議会、開催期間、集まり、集会、セッション、演奏、開会していること、開会している状態、学年、学期
- connection ← 接続、結合、連結、通信、関連性、連想、コネ、縁故、つながり
HTTP でのセッション
HTTP でのセッションとは、Amazon や楽天などのウェブサービスで、ログインしてから画面を遷移してログアウトするまでを言います。
ただし、そもそも HTTP は「ステートレス(Stateful)」なので状態を持てません。
そのためクッキー(cookie)で Web サーバーと Web ブラウザ間の状態を管理しています。
今回の場合は、HTTP でのセッションではなく「SSL/TLS」でのセッションになります。
※一言でセッションと言ってもコンピュータの世界ではいろんな分野でいろんな意味でつかわれることがあるので注意です。私も現場で他のエンジニア達と同じ用語だけど異なるレイヤーで使っていたことは何度もあります。
SSL/TLS でのセッション
SSL/TLS でのセッションは、HTTP でのセッションとは別の動作になります。
SSL サーバー証明書を利用して Web サーバーと暗号化された通信をする場合、ハンドシェイクから始まります。
ハンドシェイクが完了したら接続が確立し両者がデータを送信できるようになります。
そのため、SSL/TLS でのセッションとは、サーバーとクライアント両者が合意した接続状態と言えます。
また、セッションが新しく異なる状態になる場合は、サーバーとクライアント両者が合意した接続状態がリセットされた新しい通信と言えます。
例えば、暗号化通信用のパラメータが変わるとか。(SSL サーバ証明書が異なるとか)
なかなか自分で書いていてもよく分かっていないような状態ですが、ファイアウォールで強制的に「セッション(SSL/TLS セッションではない)」が切られない限りは、SSL サーバ証明書を入れ替えても現在の SSL/TLS のセッションは続きます。
詳細な SSL/TLS ハンドシェイクのシーケンスと内部構造は以下の記事を参考にしてください。
SSL/TLSの解説 【Part.2】 SSL/TLS ハンドシェイクの内部構造【図解】
SSL/TLS ハンドシェイク完了後は、共通鍵で暗号化・復号を行ないます。
SSL サーバ証明書はハンドシェイクの最初の部分でサーバーからクライアントに送付する際に使います。
サーバーとクライアントの暗号化通信中にサーバ証明書を使って暗号化をするわけではなく、最初のサーバーを確認する際に利用されるだけで、ハンドシェイクが完了したら「共通鍵」を使って暗号化するので、サーバ証明書は利用されません。
また、新規でセッションが張られる場合は、入れ替え後の SSL サーバ証明書を利用するので、入れ替え作業自体は問題になりません。
参考サイト
以下のサイトを参考にさせていただきました。
ELBの証明書更新時に切断は発生するのか?
https://qiita.com/ushirogouchi-lepra/items/ba9accc7d90d9cfad1aa
サーバ証明書を置換えた時のセッションについて
https://qa.atmarkit.co.jp/q/8921
コメント