
TLSとは
TLSとは
まずは、ウィキペディア(Wikipedia)の定義から確認してみましょう。
Transport Layer Security(トランスポート・レイヤー・セキュリティ、TLS)は、インターネットなどのコンピュータネットワークにおいてセキュリティを要求される通信を行うためのプロトコルである。主な機能として、通信相手の認証、通信内容の暗号化、改竄の検出を提供する。当プロトコルは(特に区別する場合を除いて) SSL(Secure Sockets Layer) と呼ばれることも多い。これは、TLSの元になったプロトコルがSSLであり、そのSSLという名称が広く普及していることによる。
上記を読んでみると、なんとなく通信のセキュリティに関わる役割をやっているそうですね。これを理解するためには、まずHTTP
とHTTPS
について分かる必要があります。
HTTPとHTTPS
HTTP
とは、Hyper Text Transfer Protocol
の略です。つまり、HypertextであるHTMLを送信するための通信規約を意味します。HTTPS
で最後のS
はOver Secure Socket Layer(SSL)
の略で、Secureという言葉からも分かるようにセキュリティが強化されたHTTPです。HTTPは暗号化されていない方法でデータを転送するため、サーバとクライアントがやり取りするメッセージを覗くことは非常に簡単です。例えば、ログインのためにサーバーに暗証番号を転送するとか、重要な機密文書を閲覧する過程で悪意のある覗きやデータの改ざんなどが起こることもあって、それをセキュリティ化したものがHTTPSです。
TLSとSSL
ウィキの方にも書いてありましたが、SSL(Secure Socket Layer)
とTLS(Transport Layer Security Protocol)
は同じものだと考えても構いません。ネスケープによってSSL
が発明されましたが、これがどんどん幅広く使われてきたら、標準化機構であるIETFのもとで管理することになってTLS
という名前に変わりました。TLS 1.0
はSSL 3.0
を引き継ぎます。しかし、まだTLS という名前よりもSSLという名前が多く使用されています。
TLSの暗号化
TLSのコア機能は暗号化です。TLSはセキュリティと性能上の理由から、二つの暗号化技法を混用しており、TLS動作方法を理解するためには、これらの暗号化技法についての理解が必要です。
共通鍵暗号
暗号を作る行為である暗号化を行う際に使用する一種のパスワードを鍵(キー)と呼びます。この鍵によって暗号化された結果が異なるため、鍵がわからないと暗号を解く行為である復号はできません。共通鍵は、その名前通りに、同一な鍵で暗号化と復号を同時に行う方式の暗号化手法を意味します。つまり、暗号化を行う際に1234という値を使用したならば、復号を行う際にも1234という値を入力しなければなりません。
echo 'this is test text' > plaintest.txt
openssl enc -e -des3 -salt -in plaintest.txt -out encryptedtest.txt
openssl
: sslの暗号化と復号を手伝ってくれるオープンソースenc -e -des3
: des3方式で暗号化する。-in plaintest.txt -out encryptedtest.txt
: plaintext.txtファイルを暗号化した結果をencryptedtest.txtファイルに保存
以下は共通鍵で復号する方法です。
openssl enc -d -des3 -in encryptedtest.txt -out plaintext2.txt
公開鍵暗号
共通鍵方式は短所があります。暗号をやりとりする人々の間で共通鍵を伝えるとが難しいという点です。また、共通鍵が流出すると鍵を獲得した者が暗号の内容を簡単に復号することができるため、暗号が無用の長物になります。このような背景で出た暗号化方式が公開鍵方式です。
公開鍵方式は、二つの鍵を持って、Aキーを暗号化するとBキーで復号することができ、Bキーで暗号化するとAキーで復号できる方式です。この方式に着目し、二つの鍵のいずれかを非公開鍵(private key、秘密鍵とも呼びます)とし、残りを公開鍵(public key)として指定します。非公開鍵は自分だけが持っていて、公開鍵を他人に提供します。公開鍵の提供を受けた他人は、公開鍵を利用して情報を暗号化します。暗号化した情報を非公開鍵を持っている者に転送します。非公開鍵の所有者は、これを用いて暗号化された情報を復号します。この過程で公開鍵が抽出したとしても、非公開鍵を知らなければ情報を復号できないため安全です。公開鍵では暗号化することはできますが、復号することはできないためです。
この方式はこんな応用もできます。非公開鍵の所有者は、非公開鍵を用いて情報を暗号化した上で、公開鍵と共に暗号化された情報を転送します。情報と公開鍵を獲得した者は、公開鍵を用いて暗号化された情報を復号します。この過程で公開鍵が漏洩すると、意図しない攻撃者によってデータが復号される危険があります。このようなリスクがあるにもかかわらず、非公開鍵を利用して暗号化する理由は何でしょうか?それはこれがデータを保護することが目的ではないからです。暗号化されたデータを公開鍵で復号できるということは、そのデータが公開鍵と対をなす非公開鍵によって暗号化されたということを意味します。つまり公開鍵がデータを提供した者の身元を保障してくれるということになるのです。これを電子署名と呼びます。
電子署名(https://www.thesslstore.com/blog/ssltls-certificate-its-architecture-process-interactions/)
それでは、理解を深めるために公開鍵を利用してRSAという方式の公開鍵を使ってみましょう。下のコマンドはprivate.pem
という名前の鍵を生成します。この身長は1024bitの長さになります。この数字が高いほど安全です。
openssl genrsa -out private.pem 1024
次のコマンドは、private.pem
という名前の非公開鍵に対するpublic.pem
という名前の公開鍵を生成します。自分の情報を提供したい人にこの公開鍵を転送すればよいのです。
openssl rsa -in private.pem -out public.pem -outform PEM -pubout