wolfSSL – TLS 1.3サポート

wolfSSL組み込みSSL/TLSライブラリは、TLS1.3クライアントとサーバの両方をサポートしています。
wolfSSLの最新リリースはこちらからダウンロードできます。

TLS1.3の優位性:

TLS バージョン1.3の変更でまず挙げられるのは、フルハンドシェイクの往復回数の削減です。クライアントがサーバーにアプリケーションデータを送出する前にTLS 1.2では2往復のフルハンドシェイクが必要でしたが、TLS1.3では1往復に削減されています。さらにサーバは、クライアントに対する最初のハンドシェイクメッセージのレスポンスとして、アプリケーションデータを送付できるようになりました。これは、ネットワークの遅れがあっても、安全な接続の確立に要する時間への影響が少ないことを意味します。

もう一つの違いは、TLS1.3のセッション再開です。これまでのTLSでは、クライアントはサーバがキャッシュを探すためのセッションIDを持っており、IDが一致した場合は、同じセキュリティパラメータを使っていました。これは、とても単純なメカニズムですが、サーバ間で状態を共有する必要がありました。

TLS1.3では、これまでのTLSのチケットシステムを再活用することにより、大幅に改善されています。ハンドシェーク完了後に、サーバはクライアントに対して新しいセッションチケットを送信します。この、クライアントに対するひとかたまりのデータであるチケットは、以前のセッションIDのように鍵を探すデータベースとして利用することができます。またこのデータは、前の接続に対応する自己暗号化、自己認証された値とすることができます。これは、サーバは状態を持たないですむということを意味します。

この仕様はプロトコルの安全性を証明すべく暗号化の専門家によって評価されてきました。セキュリティに完全はありませんが、以前あったような再ネゴシエーション、プロトコル・バージョンのダウングレーディング、圧縮、 CBCやパディングに対する攻撃などは改善され、プロトコルは全体的により強い攻撃耐性を実現しています。

TLS1.3 の性能

TLS1.3 の性能に関して興味のあるかたは下記のブログ記事を参照ください。

TLS1.3の性能 その1 – セッション再開
TLS1.3の性能 その2 – フルハンドシェイク
TLS1.3の性能 その3 – 事前共有鍵(Pre-Shared Key: PSK)
TLS1.3の性能 その4 – サーバーでの鍵ペアの事前生成
TLS1.3の性能 その5 – クライアント/サーバー認証
TLS1.3の性能 その6 – スループット

TLS1.2とTLS1.3の違い

TLS1.3プロトコルは、2018年8月にRFC 8446で定義されました。TLS1.3ではセキュリティとスピードが改善されています。TLS1.2からの主な改善点は以下のとおりです。

  • 古いアルゴリズムは、TLS1.3でサポート対象とする対称暗号アルゴリズムから削除されました。TLS1.3で残っているアルゴリズムはすべて、AEAD(Authenticated Encryptionwith Associated Data) で認証された暗号化を使用します。
  • ゼロRTT(0-RTT)モードが追加され、特定のセキュリティ特性を犠牲にすることで一部のアプリケーションデータの接続設定では往復回数を削減できるようになりました。
  • 静的RSAおよびDiffie-Helman暗号スイートは削除されました。
  • ServerHello以後のハンドシェークメッセージはすべて暗号化されます。
  • 鍵導出関数が再設計され、HMACベースのHKDF(Extract-and-Expand Key Derivation Function、抽出および拡張鍵導出関数)がプリミティブとして使用されています。
  • ハンドシェイク状態遷移は再構成され、余分なメッセージは取り除かれました。
  • ECCは基本仕様に入り、複数の新しい署名アルゴリズムが含まれています。楕円曲線のポイント・フォーマット・ネゴシエーションは削除され、各楕円曲線の単一ポイント・フォーマットが採用されました。
  • 圧縮、カスタムDHEグループ、およびDSAが削除され、RSAパディングでPSSが使用されるようになりました。
  • TLS 1.2バージョンネゴシエーション検証メカニズムは廃止され、拡張機能のバージョンリストが採用されました。
  • セッション再開(サーバー側の状態の有無にかかわらず)、および旧バージョンTLSのPSKベースの暗号スイートは、単一の新しいPSK交換に置き換えられました。

TLS1.3でwolfSSLをコンパイルする

wolfSSLライブラリで は、TLS1.3 を利用する“–enable-tls13” オプションがデフォルトで有効になっているので、次のようにコンパイルします:
$ unzip wolfssl-5.x.x.zip
$ cd wolfssl-5.x.x
$ make

wolfSSLでTLS1.3を使用する

wolfSSLには2つのクライアント/サーバーメソッドがあり、wolfSSLコンテキスト(WOLFSSL_CTX)の生成中にTLS1.3を指定するために使用できます。
WOLFSSL_METHOD *wolfTLSv1_3_server_method(void);
WOLFSSL_METHOD *wolfTLSv1_3_client_method(void);
wolfSSLサンプルクライアントとサーバで簡単にTLS1.3機能を使うことができます。例えば、wolfSSLサンプルクライアントをTLS1.3、暗号スイートTLS13-AES128-GCM-SHA256 でサーバに接続する場合は、次のように、”-v” オプションに “4” を指定し、”-l”オプションで暗号スイートを指定します:

$ ./examples/server/server -v 4 -l TLS13-AES128-GCM-SHA256
$ ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256

サンプルクライアントは外部サーバに接続することもできます。例えば、wolfSSL.comにTLS1.3で接続する場合は次のように指定します。

$ ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256 -h www.wolfssl.com -p 443 -g -A ./certs/wolfssl-website-ca.pem

このコマンドで”-h”はホスト、”-g”はHTTP GET要求、”-A” はサーバ認証のためのCA証明書を指定します。

このバージョンでは、以下のTLS1.3暗号スイートをサポートしています。

TLS13-AES128-GCM-SHA256
TLS13-AES256-GCM-SHA384
TLS13-CHACHA20-POLY1305-SHA256
TLS13-AES128-CCM-SHA256
TLS13-AES128-CCM-8-SHA256

こちらのリンクもご参照ください:

TLS1.3 RFCページ
TLS1.3プロトコル概要(日本語訳)
TLS1.2とTLS1.3の違いは何?
TLS v1.3の優位性:何が良くなったか?
wolfSSL #TLS13: TLS 1.3 βバージョンを公開しました
ウェビナー「組み込み/IoTデバイスをTLS 1.3でセキュアにしよう」録画版

TLS1.3サポートに関するご質問は info@wolfssl.jp までお問い合わせください。