はじめに
本記事はセキュリティ Advent Calendar 2020の記事となります。
SSL/TLSはHTTPS通信などで使用されていることで有名な通信のセキュリティを担保してくれるプロトコルです。通信のセキュリティ(安全性)には様々な要素が含まれていますが、SSL/TLSは主に通信が周囲に読まれないこと、情報が改ざんされていないことを保障するプロトコルとなります。
本記事では、以下のことについて記載を行います。
- 通信の安全性とは
- SSL/TLSの役割
- SSL/TLSで使用されている技術
通信の安全性とは
通信の安全性について説明を行います。
情報セキュリティの3要素
通信の安全性は以下の3大要素で構成されています。
- 機密性(Confidentiality)・・・情報へのアクセス許可のある人だけが情報を利用できること
- 完全性(Integrity)・・・情報資産に正確性があり改ざんされていないこと
- 可用性(Availability)・・・情報へのアクセス許可のある人が必要な時に情報にアクセスできること
この3要素は上記の3要素の頭文字をとって情報セキュリティのCIAと呼ばれています。
SSL/TLSとは
SSL/TLSは二つのプロトコルの名前であり、それぞれSSL(Secure Socket Layer),TLS(Transport Layer Security)となっています。SSL→TLSへ発展したという経緯があります。現在はTLSがメインで使用されています。
SSL/TLSの機能
SSL/TLSは主に以下のことを行います。
- 通信の暗号化
- 認証(なりすまし防止)
- 改ざん検知
通信の暗号化は第三者に情報が読めないようにします。従って、機密性がある程度保証されます。また、改ざん検知の機能もあるため、完全性についても保障されます。ただし、可用性についてはSSL/TLSの範囲外となります。(可用性を脅かす通信の攻撃としては、DoS攻撃などが挙げられます。)
先ほどの情報セキュリティのCIAのうち機密性と完全性に対してある程度保証されます。
SSL/TLSの技術
SSL/TLSは上記の機能を有するために様々な技術が使用されています。
- 暗号技術(ハイブリッド暗号方式)
- MAC(Message Authentication Code)
- デジタル署名
- サーバ証明書
暗号技術
クライアントサーバ間の通信を暗号化します。この際に使用されるものは公開鍵暗号方式と共通鍵暗号方式の両方が使用されます。(ハイブリッド暗号方式と呼ばれます。)
######公開鍵暗号方式
公開鍵暗号方式では、公開鍵と秘密鍵のペアで暗号化、復号化ができます。公開鍵は誰でも参照でき、秘密鍵は持ち主しか知らない情報となります。したがって、送りたい相手の公開鍵で暗号化した通信は送りたい相手にしか復号化できないという仕組みです。
######共通鍵暗号方式
通信したい相手と鍵を共有して、暗号化復号化を行う仕組みです。
######ハイブリッド暗号方式
公開鍵暗号方式は、暗号復号による負荷が高いことがデメリットとして挙げられます。共通鍵暗号方式は負荷は少ないが、鍵の伝達方法、鍵の管理が大変になります。そこで、二つを複合したハイブリッド暗号方式がSSL/TLSでは使用されています。ざっくりとした仕組みとしては、共通鍵の交換を公開鍵暗号方式で実施し、後は共通鍵で暗号化を実施するという流れです。
MAC
MAC(Message Authentication Code)はメッセージ認証符号と訳されます。この技術は完全性を保障するために使用される技術となります。
デジタル署名
なりすましや、否認防止のために使用されます。公開鍵暗号方式では、送付したい相手の公開鍵で暗号化することでその人にしか復号できないという仕組みです。逆に秘密鍵で暗号化した場合、送付元の情報があれば、誰でも復号化はできますが、暗号化できる人は送付した本人しかできないため、否認防止、なりすまし防止に役立つという仕組みです。通信相手が本当に正しい人か判断することができます。
サーバ証明書
ドメイン名 + サーバの所有者が正しいことを証明するものです。認証局に証明書発行要求を出すことによって認証された証明書を手にすることが可能となります。
SSL/TLSはこれらの技術を使用して、通信の安全性を高めてくれています。
その他拡張機能
SSL/TLSには拡張機能と呼ばれるものがあります。SNIについて記載を行います。
SNI(Server Name Indication)
従来は、一つのサーバ(一つのIPアドレス)につき一つのサーバ証明書を使用するということが基本でした。SNIを使用すると一つのサーバ内に複数のWeb サーバを構築することができ各々に対して証明書を登録することができます。その際、IPアドレスのみの情報では、どの証明書を使用していいかわからないため、TLSハンドシェイクの中に拡張フィールドとしてSNIフィールドがあります。その情報を見てサーバ側も証明書を選択することができます。(HTTPヘッダにホスト名等の情報があるが、SSL/TLSの場合はデータの交換より前に情報が必要となる。)
TLS通信の確認
実際に、httpsサーバを構築し、TLSハンドシェイクのパケットキャプチャを確認しました。
基本動作としてはクライアント→サーバへ使用可能なTLSバージョン情報や暗号方式、SNIの情報を伝えます。(Client Hello)そのレスポンスとしてサーバ→クライアントへ暗号方式決定、TLSバージョンの決定を行います(Server Hello)。その後証明書の情報等をクライアントへ送付します。(Certificate)
これらの通信が終わった後、データが暗号化されて通信されます。
暗号化を一度行うとセッションIDが発行されるため、再度通信を行う際はハンドシェイクのすべてを行う必要がありません。そのため、二度目の通信は最初に比べて少し軽いみたいです。
さいごに
以上、TLSについてちょっと簡単にまとめてみたという文書です。セキュリティ技術関連は無意識のうちに使用しているところが多いので、改めてふたを開けるといろいろ面白かったです。
TLSの話をざっくりとした感じで書いていますが、間違い等ございましたらご指摘のほうお願いいたします。
ありがとうございました。