SSLとGPGの秘密鍵と鍵交換(訂正)

Lavabitに関するGeekなページの記事をみて、GPG(あるいはS/MIMEなどのメッセージ・データ暗号化)と、SSLの秘密鍵や鍵交換が混同されているようなのでメモ。

(追記)

実際にRSA鍵交換が有効だったようで、通信についても証明証用の秘密鍵から復号できた。

失礼しました。御指摘ありがとうございます。 (/追記)

SSLとGPGの秘密鍵

LavabitのようなWeb上の暗号化システムでは、二つの全く異なる暗号化の仕組みがある(あった)。

SSLでのサーバー証明用秘密鍵

まず、サーバーとユーザーの間はTLS(SSL)で共通鍵による暗号化と、公開鍵暗号による検証が行われる。

ユーザーが本人であることを認証するためには通常パスワード認証を使うが、サーバー認証、すなわちサーバーが本当にLavabitであると保証するためには、サーバー証明書と呼ばれる公開鍵暗号が用いられる。

Lavabitのサーバーは自身が本物であることを示すために、サーバー証明書に対応する秘密の暗号鍵、いわゆるSSL秘密鍵を保持している。ユーザーはサーバーから送られたメッセージが証明書に記載された復号鍵で正しく復号できるか検証する。

この秘密鍵が盗まれると、Lavabitのふりをした偽のサーバーを作ることが出来てしまう。サーバー証明書の秘密鍵を押収することで、それ以降に送受信されるメール内容を奪うことはできるが、FBIが興味を持つであろう過去の暗号化されたメールについてはサーバ証明書の秘密鍵があっても意味は無い。

SSLにおける鍵交換

証明書と対応する署名用の秘密鍵と、TLSセッションの暗号化のための共通鍵暗号(AESなど)とは異なる。共通鍵はTLS接続の都度、DH鍵共有などで安全に生成され、(一定時間キャッシュされることはあるが)接続が終われば破棄される。そのため共通鍵はサーバーにもユーザーにも残らない。安全な鍵共有アルゴリズムを利用していれば、通信を中継するルーターなどにも残ることはない。

TLSではDH方式などの安全な鍵共有は基本的に必須(なければブラウザが警告する)なので、LavabitがTLS/SSLにおいてDH鍵共有をしていなかったという事は考えにくい。

(追記) DH鍵交換が無効化されていて、RSA鍵交換が優先される状態だった模様。RSA鍵交換では署名用のRSA公開鍵を流用して、クライアントが指定した鍵を公開鍵で暗号化してサーバーが復号する。そのため、FBIが通信を傍受していた期間に交された通信は解読され得る。

RSA鍵共有では、サーバーのデータを閲覧し、その後サーバーから削除していたとしても通信記録に全てが残ってしまうため、現在ではRSA鍵交換は使うべきではなく、互換性のために残されている(と思っていた) (/追記)

GPG暗号の復号用秘密鍵

GnuPGが基盤とする公開鍵暗号では、送信者が「受信者の公開された暗号鍵」で暗号化し、受信者はメールボックスに届いたメールを「受信者の秘密の復号鍵」で解読する。 メールではなくデータの暗号化であれば、書き込み時に(公開してもよい)暗号鍵で暗号化、読み出し時に秘密の復号鍵を用いる、と言い換える事ができる。いずれにせよ、秘密鍵を持っているユーザーだけが、メッセージを復号出来る。

Lavabitではこの暗号処理をサーバー上で行ない、ユーザーのメールデータを公開鍵で暗号化して保管していたようだ。例えばメール受信用のSMTPサーバーは暗号化してデータベースに保存するだけで、コピーや復号鍵を持つ必要は無い。

ただし、LavabitはWebメールサービスなので、秘密鍵がサーバーに存在しなければデータを復号して表示出来ない。つまりユーザーの秘密鍵もまたLavabit側に保存されていたことになる。 本来メッセージの復号処理はユーザーの所有する端末上で行うべきだが、Lavabitではサーバー側が秘密鍵を管理して復号処理をも代行することで、GnuPGなどを導入できない端末でも利用できた。

このサーバーに置かれた鍵が、FBIが欲しがるユーザーの過去のメールデータを復号するための秘密鍵にあたる。

ユーザーが復号用の秘密鍵を自分のPCで管理していれば、FBIは利用者全員のPCを一つ一つ押収する必要があったのだが、Lavabitサーバーに秘密鍵管理を任せていたために、FBIは全員分のメールと秘密鍵を一度に押収出来てしまった。

GPG署名での鍵交換

鍵交換を使うことでより安全になるという部分は、メール内容のGPG署名の上で、更に鍵交換を適用するべき、という意味と思われる。

GPG暗号の用いる暗号基盤では長期間同じ秘密鍵を使い続けることを前提としているため、一度秘密鍵が盗まれると、対応する公開鍵で暗号化した過去の受信メールが全て復号されてしまう。 Lavabitでいえば、わずかな秘密鍵のリストで全てのデータを復号される事になった。

そこで、長期間使い続ける秘密鍵は署名と鍵交換にだけ利用し、メール内容の暗号化には通信の都度(あるいは一定期間毎に)新しい鍵を生成・交換して暗号化を行う、という方法がある。

たとえば、最初のメールに自身のGPG署名付きの新しい公開鍵を返信先として指定してメールし、秘密にしたい内容はその返信に添付された公開鍵を使って送る、というような場合。

長期的に使う本来の秘密鍵を破棄するわけにはいかないが、使い捨ての鍵であれば、メールを再度読む必要が無くなったら秘密鍵を破棄できる。 つまり、GPG署名の上でさらに鍵交換を利用すると、傍受したメールを復号するために、すぐに削除されてしまう一時的な鍵を盗み出しておかなければならなくなり、過去のメールを復号することが困難になる。

たとえ全てのメールが中継サーバーで傍受されていて、自分の現在の復号用秘密鍵が押収されたとしても、一時的な鍵が削除されていればメールは復元することが出来ない。TLSのクライアント認証や、SSHによるクライアント・サーバー認証はこれを自動的に行なっている。

ただしLavabitの件に習うと、こういった秘密鍵を破棄する手法は、それ自体証拠隠滅と見なされるかもしれない。