サービスをSSL/TLSに対応するにあたって、その仕組みを理解しておくことは、より安全性の高いサービス構築へとつながります。 この記事では、SSL/TLSの仕組みや、その周辺知識について解説します。
SSL/TLSとは
SSL(Secure Socket Layer)は、通信を暗号化する技術のことです。
通常、サーバとクライアントのやりとりにはHTTP通信が行なわれますが、これには攻撃者によるなりすましを防ぐ手段がありません。 SSLは、このような問題を解決するために、Netscape Communications社によって策定されました。
現在は、標準化団体であるIETFによってTLS(Transport Layer Security)として標準化されています。
なお、本記事ではSSL/TLSを単にSSLと呼称します。
URIスキームとポート番号
HTTP通信のURIスキームにはhttp
が用いられますが、SSLを利用した通信の場合はhttps
が用いられます。
また、サーバはクライアントからのhttps
接続には443
番ポートを割り当てています。
通信フロー
SSLによる通信は、まず事前準備として(1)サーバ側にサーバ証明書を設置します。 クライアントは、このサーバ証明書を利用することにより(2)サーバとの暗号化通信を行ないます。
具体的な流れは以下のとおりです。
(1) サーバ証明書を設置する
- サーバは秘密鍵と公開鍵(署名要求:CSR)を生成する
- サーバは認証局にCSRを送付する
- 認証局はCSRに電子署名を付与し、サーバ証明書としてサーバに送付する
- サーバはサーバ証明書を設置する
(2) 暗号化通信を行なう
- クライアントはサーバにSSLを利用した通信を行なう
- サーバとクライアントで暗号化仕様交渉を行なう
- 暗号スイート(後述)を提示し合い、どれを使うか決める
- サーバはクライアントにサーバ証明書を送付する
- クライアントはサーバ証明書をブラウザに搭載されているルート証明書で検証する
- クライアントは共通鍵を生成し、サーバ証明書に内包されている公開鍵で暗号化する
- 共通鍵はクライアントとサーバの双方から提供される乱数により生成するため、一義的に決まる
- サーバは共通鍵を秘密鍵で復号化する
- 以降、クライアントは平文を共通鍵で暗号化し、サーバはこれを共通鍵で復号化する
暗号スイートとは
サーバ証明書の設置や暗号化通信を行なう際、様々な箇所で暗号化が行なわれています。 この際に使用する暗号化アルゴリズムの組み合わせを暗号スイートといいます。
暗号スイートは、以下で確認できます。
$ openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
...
1列目が暗号スイート名、2列目がプロトコルのバージョンです。 3〜6列目は、それぞれ以下を表しています。
- 鍵交換方式:Kx(Key Exchange)
- 鍵認証方式:Au(Authentication)
- 共通鍵による暗号化通信方式:Enc(Encryption)
- メッセージ認証符号方式:Mac(Message Authentication Code)
このKx/Au/Enc/Macの組み合わせが暗号スイートであり、この組み合わせによって暗号の強度などが異なってきます。
セキュリティ向上のための考え方
上述した通信フローから逆算して考えると、次のような方法によりサーバのセキュリティを向上させることができると考えられます。
- 信頼のある認証局であること
- SSL/TLSのバージョンが適切であること
- SSLではなくTLSを導入する
- 必要に応じてバージョン固有の問題に対応する
- 鍵が強固であること
- 適切な暗号スイートを提示する
- 適切な有効期限であること
テスト方法
サーバのセキュリティの強度をテストする方法として、以下のような診断サービスがあります。
あわせて読みたい
本記事とあわせて、以下の記事を読むことで、SSL/TLSに関して深く理解することができます。
おわりに
以上で基本的なSSL/TLSの仕組みは把握できると思います。 この知識をもとに、無料のSSLサーバ証明書であるLet's Encryptの導入について後日記事を公開する予定です。