SSL/TLSプロトコル
SSL (Secure Socket Layer)とは,インターネット上でデータを暗号化して送受信する方法のひとつである.TLS(Transport Layer Security)は,SSL を標準化したものである.これらを総称して SSL/TLS とも呼ばれる.
通常,インターネット上では、暗号化されずにデータが送受信されている.そのため,通信途中でデータを傍受されると情報が第三者に漏れてしまう可能性がある.
また,相手のなりすましに気付かず通信すると,データが不当な相手に取得されてしまう可能性がある. 現在,クレジットカード番号や個人情報を扱う多くのWebサイトでは,これらをを防ぐ目的で SSL/TLS プロトコルを利用している.
利用者が SSL/TLS を利用できるサーバとデータをやり取りする場合には,Webサーバと利用者のコンピュータが相互に確認を行いながらデータを送受信するようになるため,インターネットにおける通信内容の暗号化およびなりすましの防止が実現される.
SSL/TLS
SSL (Secure Socket Layer)は,OSI 参照モデルにおけるセッション層のプロトコル規格で,プロセス間通信で用いられるソケットに対してセキュリティ機能を追加したものと言える.
SSL第3版(SSL3.0)の規格が次のインターネット・ドラフトに記載されている.
draft-freier-ssl-version3-00.txt
TLS (Transport Layer Security)は,SSL をベースに IETF が標準化を図ったものである.
RFC 2246: The TLS Protocol Version 1.0, 1999.
RFC 4346: The TLS Protocol Version 1.1, 2006.
RFC 5246: The TLS Protocol Version 1.2, 2008.
RFC 8446: The TLS Protocol Version 1.3, 2018.
SSL と TLS の主な相違点は,共有する鍵や初期値の生成方法,データの完全性の検証を行うための MACの生成方法,サポート暗号アルゴリズムが異なる点である.
なお,SSL 3.0 には脆弱性が指摘されており,TLS の使用が推奨されている. また,SSL 3.0 の廃止も求められた (RFC 7568).その後,TLS1.0/TLS1.1/TLS1.2 にも脆弱性が発見され,TLS1.3 への移行が始まっている.
SSLプロトコルは次の2つの層から構成される.
- メッセージ層
ハンドシェイクプロトコルやユーザデータなどのメッセージを処理する層である.
- レコード層
データトランスポート層の直上に位置づけられ,サーバとクライアント間のデータ転送をレコードというブロック単位で行なう層である. レコードには次のデータが格納される.
- プロトコル種別(Type)
- プロトコルのバージョン番号(Version)
- データ部の長さ(Length)
- データ部(Fragment)
データ部は,214バイト以下の長さブロックに分割され送受信される. このブロックの分割と組み立ては上位のプロトコルには透過的に行われる.
データ部は,圧縮処理および共通鍵暗号アルゴリズムで暗号化することができる.また,このときメッセージの認証コード(MAC)を付加することができる.
SSL/TLS プロトコルの概要
SSL/TLS プロトコルの概要を示す.
- Alertプロトコル
Alertプロトコルは,プロトコル処理中のエラー発生通知に用いるもので,Alertメッセージを送信することにより行なわれる. Alertメッセージは,SSLレコード層でやり取りされるメッセージで,エラーのレベル(AlertLevel)とその内容(AlertDescription)の2つの情報から構成される. エラーのレベルには,fatal(致命的)とwarning(警告)がある. fatalは,直ちにコネクションを切断すべきことを意味する.
- Change Cipher Specプロトコル
Change Cipher Specプロトコルは,通信に使用する暗号アルゴリズムを変更することを相手に通知するためのプロトコルで,ChangeCipherSpecメッセージにより行なわれる.
ChangeCipherSpecメッセージは,サーバとクライアント間で交渉され決定された暗号方式と鍵を用いて以後の通信が行なわれることを確認するために,サーバとクライアントのそれぞれによって送信される.
クライアントは,ClientKeyExchageメッセージまたはClientVerifyメッセージの後にChangeCipherSpecメッセージを送る. サーバはクライアントから受信した鍵交換メッセージの処理が正常に終了した後にChangeCipherSpecメッセージを送る.
- Handshakeプロトコル
Handshake(ハンドシェイク)プロトコルは,サーバとクライアントの間において双方が互いに相手を認証したり,通信で使用する暗号アルゴリズムや鍵について双方が合意するための手続きである.
ハンドシェイクプロトコルのメッセージは次の形式を持つ.
- Type
メッセージの種類(1バイト)
- Length
Body部のバイト長(3バイト)
- Body
Typeに応じたデータ
以下に,TLS1.2 のハンドシェイクプロトコルの概要を示す.TLS1.3 はこちらを参照.
sequenceDiagram
Client->> Server: ClientHello
Server->> Client: ServerHello
Server-->> Client: Certificate / ServerKeyExchange / CertificateRequest
Server->> Client: ServerHelloDone
Client-->> Server: Certificate
Client->> Server: ClientKeyExchange
Client-->> Server: CertificateVerify
Client->> Server: ChangeCipherSpec [Begin new CipherSpec]
Client->> Server: Finished
Server->> Client: ChangeCipherSpec [Begin new CipherSpec]
Server->> Client: Finished
Server-> Client: Application Data
- ClientHelloメッセージ
クライアントは,最初にサーバに接続するとき,サーバからHello Requestを受けとったとき,および暗号化パラメータなどを変更するときに,ClientHelloメッセージをサーバに送信する.
クライアントはClientHelloメッセージをサーバに送信し,サーバからのServerHelloメッセージを待つ. ClientHelloメッセージには,クライアントがサポートする暗号方式およびデータ圧縮方式の一覧が含まれる.
- ServerHelloメッセージ
ClientHelloメッセージに対しサーバは,ServerHelloメッセージを返す. このメッセージには,クライアントが指定した中からサーバが選択したこのセッション用の暗号方式と圧縮方式が含まれる.
クライアントが示した暗号化方式と圧縮方式の一覧にサーバが対応できないときは,Alertメッセージを返し接続要求が拒否される.
- ServerCertificateメッセージ
サーバは,ServerHelloメッセージを送った後にServerCertificateメッセージでX509証明書を送る(オプション).
- ServerKeyExchangeメッセージ
サーバが証明書を持っていないか署名用の証明書しかない場合,ServerKeyExchangeメッセージを送る.
このメッセージには,鍵交換に必要な公開鍵やパラメータ(Diffe-Hellman法の場合の素数,原始根)が含まれる.
- CertificateRequestメッセージ
サーバがクライアントの認証を求める場合に送信される. サーバが期待する証明書の形式とその発行機関名が優先順位付きで通知される.
- Server Hello Doneメッセージ
サーバは,CertificateRequestメッセージの送出を終わると,ServerHelloDoneメッセージを送りサーバ側の処理が終了したことを通知する.
- ClientCertificateメッセージ
サーバから要求された証明書を送る. 証明書がない場合,証明書がないというAlertメッセージを送る. これに対するサーバの対応は,サーバに任されている.サーバが handshake failure を返してコネクションを切断することもできる.
- ClientKeyExchangeメッセージ
サーバとクライアントが共有するマスタ・シークレットを生成する元になる情報(プリマスタ・シークレット)を送るためのメッセージである.
用いられる暗号アルゴリズムによりメッセージの内容は異なる. RSA暗号の場合は,46バイトの乱数データとバージョン番号をサーバの公開鍵で暗号化したもの,Deffie-Hellmanの場合はクライアントの公開鍵になる.
- CertificateVerifyメッセージ
クライアントが署名機能のある証明書を送信する場合に送られる. このメッセージは,MD5およびSHAによる2つのメッセージ認証コード(MAC)で構成される. サーバがクライアントの証明書の認証を行なうために用いられる.
- Finishedメッセージ
ハンドシェイクの最後にクライアントとサーバはそれぞれFinishedメッセージを送信する.このメッセージには,Helloメッセージ以後に送信された情報のハッシュ値が含まれる. これにより,クライアントとサーバが同期が取れていることを確認する.
- Application Data
Finishedメッセージの後に,アプリケーションデータが送信される. アプリケーションデータは,ハンドシェイク手順で選択された圧縮法で圧縮され,選択された暗号方式で暗号化される.
- 鍵の生成
ハンドシェイクプロトコルにより,暗号アルゴリズムの選択,当事者の本人認証,マスタシークレットの作成などが行なわれる. マスタシークレット(48バイト)は,クライアントが ClientKeyExchangeメッセージでサーバに送ったプリマスタ・シークレットおよび双方のHelloメッセージに含まれる乱数データを元に MD5 および SHA ハッシュ関数を用いて次のように生成される.
master_secret = MD5(pre_master_secret + SHA('A' + pre_master_secret +
random_in_ServerHello + random_in_ClientHello)) +
MD5(pre_master_secret + SHA('BB' + pre_master_secret +
random_in_ServerHello + random_in_ClientHello)) +
MD5(pre_master_secret + SHA('CCC' + pre_master_secret +
random_in_ServerHello + random_in_ClientHello));
このマスタシークレットと Helloメッセージに含まれる乱数データを用いて以下のように key_blockデータを計算する.
key_block = MD5(master_secret + SHA(master_secret + random_in_ServerHello +
random_in_ClientHello + 'A')) +
MD5(master_secret + SHA(master_secret + random_in_ServerHello +
random_in_ClientHello + 'BB')) +
MD5(master_Secret + SHA(master_secret + random_in_ServerHello +
random_in_ClientHello + 'CCC')) + [...];
必要なサイズの key_blockデータが計算されたなら,このデータを分割し次の暗号認証用の鍵データ等を作る.
- Client_write_MAC_secret
クライアントによるデータの認証に用いられる認証鍵
- Server_write_MAC_secret
サーバによるデータの認証に用いられる認証鍵
- Client_write_key
クライアントによるデータの暗号化に用いられる暗号鍵
- Server_write_key
サーバによるデータの暗号化に用いられる暗号鍵
- Client_write_IV
クライアントによるデータの暗号化時に用いられる初期ベクトル
- Server_write_IV
クライアントによるデータの暗号化時に用いられる初期ベクトル
- 暗号アルゴリズム
次の暗号アルゴリズムが使用される(→ TLS/SSL 暗号スイート 参照).
- SSL 3.0
- 鍵交換
RSA,Deffie-Hellman(DH),Fortezza
- 暗号化
RC2,RC4,IDEA,DES,Triple-DES
- 認証
DSS,RSA
- ハッシュ関数
MD5,SHA
- TLS 1.2
- 鍵交換
RSA,DH-RSA,DHE-RSA,ECDH-RSA,ECDHE-RSA,DH-DSS,DHE-DSA,ECDH-ECDSA.ECDHE-ECDSA(→ Forward Security (FS) 参照)
- 暗号化
AES,Camellia,ARIA,SEED,Triple-DES,RC4
- 認証
DSS,RSA,ECDSA
- ハッシュ関数
HMAC-MD5,HMAC-SHA1.HMAC-SHA256/384,AEAD
- TLS 1.3
- 鍵交換
DHE,ECDHE, PSK
- 暗号化
AES,ChaCha20
- 暗号利用モード
CCM, GCM,Poly1305
- 認証
RSA,ECDSA, EdDSA, PSK
- ハッシュ関数
SHA256, SHA384