サービスを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) サーバ証明書を設置する

  1. サーバは秘密鍵と公開鍵(署名要求:CSR)を生成する
  2. サーバは認証局にCSRを送付する
  3. 認証局はCSRに電子署名を付与し、サーバ証明書としてサーバに送付する
  4. サーバはサーバ証明書を設置する

(2) 暗号化通信を行なう

  1. クライアントはサーバにSSLを利用した通信を行なう
  2. サーバとクライアントで暗号化仕様交渉を行なう
    • 暗号スイート(後述)を提示し合い、どれを使うか決める
  3. サーバはクライアントにサーバ証明書を送付する
  4. クライアントはサーバ証明書をブラウザに搭載されているルート証明書で検証する
  5. クライアントは共通鍵を生成し、サーバ証明書に内包されている公開鍵で暗号化する
    • 共通鍵はクライアントとサーバの双方から提供される乱数により生成するため、一義的に決まる
  6. サーバは共通鍵を秘密鍵で復号化する
  7. 以降、クライアントは平文を共通鍵で暗号化し、サーバはこれを共通鍵で復号化する

暗号スイートとは

サーバ証明書の設置や暗号化通信を行なう際、様々な箇所で暗号化が行なわれています。 この際に使用する暗号化アルゴリズムの組み合わせを暗号スイートといいます。

暗号スイートは、以下で確認できます。

$ 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の組み合わせが暗号スイートであり、この組み合わせによって暗号の強度などが異なってきます。

セキュリティ向上のための考え方

上述した通信フローから逆算して考えると、次のような方法によりサーバのセキュリティを向上させることができると考えられます。

  1. 信頼のある認証局であること
  2. SSL/TLSのバージョンが適切であること
    • SSLではなくTLSを導入する
    • 必要に応じてバージョン固有の問題に対応する
  3. 鍵が強固であること
    • 適切な暗号スイートを提示する
  4. 適切な有効期限であること

テスト方法

サーバのセキュリティの強度をテストする方法として、以下のような診断サービスがあります。

あわせて読みたい

本記事とあわせて、以下の記事を読むことで、SSL/TLSに関して深く理解することができます。

おわりに

以上で基本的なSSL/TLSの仕組みは把握できると思います。 この知識をもとに、無料のSSLサーバ証明書であるLet's Encryptの導入について後日記事を公開する予定です。