Mbed TLSの概要と特徴

今回は、これまで何度か触れてきたMbed TLSについて説明をしていきたいと思います。TLS(Transport Layer Security)は、通信の暗号化を行うプロトコルとして、IoTのセキュリティを実現する手段の一つとして頻繁に利用されています。また、通信の暗号化だけでなくデバイスの認証手段としてもよく使われています。

SSLとTLS

ところで、TLSは頻繁にSSL(Secure Sockets Layer)と呼ばれています。なぜ、SSLとTLSという二つの名前があるのでしょうか。少し余談になってしまいますがSSLとTLSの違いについて説明しましょう。SSLは、1994年、当時幅広く利用されていたNetscape Navigatorというウェブブラウザを開発していたNetscape Communications Corporationというアメリカの会社がリリースしたプロトコルです。翌1995年にSSL 2.0が実装された同社のブラウザがリリースされました。しかし、このSSL 2.0には重大な脆弱性が発見されたため、1995年末にはSSL 3.0がリリースされました。

1996年以降、SSLの標準化はNetscape CommunicationsからIETF(The Internet Engineering Task Force、インターネット技術の標準化を推進する任意団体)のTLSワーキンググループに移管され、1999年にTLS 1.0がリリースされました。TLS 1.0とSSL 3.0との機能の違いはあまり多くはありませんが、仕様の詳細が変更されています。また、TLS 1.0はSSL 3.0より新しい規格であることを示すため、ネゴシエーション時に使われるバージョン番号は3.1となっています。

こうして登場したTLSは、2006年にTLS 1.1、2008年にTLS 1.2、2018年にTLS 1.3がそれぞれリリースされています。SSLについては、SSL 2.0が2011年に使用が禁止され、SSL 3.0は2015年に使用が禁止されていますので、現在私たちがウェブブラウザで使っているプロトコルはTLSのはずです。

共通鍵と公開鍵

TLSの仕組みについて説明する前に、「共通鍵暗号」と「公開鍵暗号」について説明をしておかなければなりません。共通鍵暗号とは、暗号化と複合(暗号化されたデータを元に戻すこと)に同じ鍵を用いる方式です。共通鍵暗号方式は公開鍵暗号方式と比較して高速に暗号化の計算することができ、コンピュータの負荷が少なくて済むため、あらゆる場所で頻繁に使われています。「鍵」など暗号技術に使われる用語について、シーザー暗号を例に説明をしましょう。

シーザー暗号は、古代ローマのジュリアス・シーザーが使ったといわれている暗号です。暗号化というと、一般的にはこの方法を思い浮かべる方も多いでしょう。シーザー暗号は、「ABC」を「CDE」といった具合にずらして暗号化を行います。この、「ずらす」という行為はアルゴリズムですが、「ずらす数」が「鍵」です。この例ではアルファベットを二つずらしていますから、鍵は「2」になります。

共通鍵暗号方式では、平文(元の文章)を暗号にする際にも、暗号化された文章を平文に復号する際にも、同じ「鍵」を用います。ですから「共通鍵暗号」と呼ばれます。共通鍵暗号の弱点は、鍵が漏洩してしまうと復号されてしまうにもかかわらず、鍵を配布しなければならないということです。また、鍵さえあれば、誰でも暗号化も行うことができ、情報を偽造することもできてしまうことです。

この鍵の配送問題を解決したのが公開鍵暗号です。公開鍵暗号には、暗号化するための「公開鍵」と、復号するための「秘密鍵」の二つが存在します。

図

公開鍵暗号を使った通信は、このように行われます。

  1. Bさん(受信側)は、公開鍵と秘密鍵を作成します。
  2. Bさんは、公開鍵を一般公開します。
  3. Aさんは、公開鍵を使って暗号化をして、Bさんに暗号を送ります。
  4. 暗号文を受け取ったBさんは、秘密鍵を使って復号します。

秘密鍵はBさんだけが持っているため、暗号文を秘密鍵を持たない第三者が入手しても復号することはできません。またAさんも、持っているのは公開鍵だけで、秘密鍵を持っていないため暗号文を復号することはできません。公開鍵暗号は、秘密鍵で暗号化したものは公開鍵でしか復号できず、公開鍵で暗号化したものは秘密鍵でしか復号できないという仕組みです。

この公開鍵暗号にも問題は残されています。例えば、上記の2.の段階で、CさんがBさんのふりをしてAさんにCさんの公開鍵を渡すというケースです。こういった、なりすまし攻撃(マン・イン・ザ・ミドル攻撃)を防ぐために、公開鍵を信頼できる第三者(CA(Certification Authority)、認証局)が確認をし、電子署名を行います。この認証局(CA)による公開鍵の認証の仕組みは、公開鍵暗号基盤(PKI, Public Key Infrastructure)と呼ばれています。

余談ですが、電子署名は公開鍵暗号方式の「復号はもう一方の鍵を持つ者しかできない」という特徴を利用して、データの作成者が偽られていないか、データの改ざんが行われていないかを確認するための技術です。電子署名は、ハッシュと呼ばれる、与えたデータから一定長のデータを生成する演算を行って得られたハッシュ値を公開鍵暗号を使って暗号化することで行われます。

TLS通信の仕組み

公開鍵暗号について理解できたところで、TLSの仕組みについて説明しましょう。例えばウェブをHTTPSで閲覧しているときには、TLSによって提供されるセキュアな接続の上でHTTP通信が行われています。TLSでは公開鍵暗号が使われていますが、全ての通信が公開鍵暗号で暗号化されているわけではありません。一般的に公開鍵暗号は共通鍵暗号よりも複雑な計算が必要です。このため、データの暗号化には仮の共通鍵(セッション鍵)を使用し、その共通鍵の配送のみを公開鍵暗号で行う方式がとられることが多く見られます。例えばHTTPSを例に挙げると、通信は次のように行われています。

図

  1. クライアント(Web ブラウザ)が、使用可能な暗号方式をサーバに送信します。
  2. サーバは、双方が利用可能で、最も強度の高い共通鍵暗号を選択します。
  3. サーバは公開鍵が含まれたサーバ証明書をクライアントに送信し、サーバのなりすましを防ぎます。
  4. クライアントは、共有鍵(セッション鍵)を作成し、サーバの公開鍵で暗号化してサーバに送ります。サーバは受け取った共有鍵を秘密鍵で復号します。
  5. セッション鍵を用いて、暗号化し暗号化通信を行います。

組み込みとTLS

ここまでTLSや暗号について説明してきたことで、TLSを用いた通信の暗号化には様々な計算処理や認証の仕組みがあることを掴んでいただけたと思います。TLSや暗号の実装は相当に複雑なだけでなく、脆弱性の検証や対策など継続したメンテナンスが必要になります。実際のところサーバー側のTLSの実装も良く知られたものとしてはOpenSSLGnuTLSくらいと決して多くはありません。組み込み用の小型の実装では、wolfSSLとMbed TLSくらいです。

Mbed TLSは、以前はPolarSSLというオープンソースのライブラリで、Armが買収したOffsparkという会社が開発とメンテナンスを行っていました。先ほども述べたようにTLSの実装はあまり多くは存在しませんので、Mbed TLSはMbedに限らず、主に組み込み用に幅広く使われています。

ところで、最近の主だったIoT向けのクラウドサービスは、デバイス(マイコン)との通信はTLSで暗号化することを前提としています。また、デバイスの認証は証明書を用いて行われます。従来のIDとパスワードといった共有鍵を使うのではなく、公開鍵暗号の仕組みを使うようになっています。AWS IoTGoogle Cloud IoTAzure IoT Hubも、このようにTLSを使い認証を行う様になっています。

実際の実装については、Armの担当者の方がそれぞれのクラウドサービスに向けたサンプルを作って公開していますので、それらが非常に参考になります。見たところ、FRDM-K64Fに向けてサンプルが作られていますので、このボードで試してみるのが最も容易そうです。

ハードウェアによる暗号化支援

このFRDM-K64Fのプラットフォームページにも記載がありますが、最近ではマイコンにもTLSなどで使う暗号化の支援機能がハードウェアとして搭載されています。例としているFRDM-K64Fでは、セキュリティ機能として以下の二行の記載がありました。

  1. Hardware CRC and random-number generator modules
  2. Hardware encryption supporting DES, 3DES, AES, MD5, SHA-1 and SHA-256 algorithms

まず、1のCRCと乱数生成モジュールについてです。CRCは良く知られた誤り検出に使われる手法ですが、データの改ざんに対する耐性はありません。次の乱数生成モジュール(random-number generator modules)は、暗号処理のパフォーマンスに大きな影響を与えます。セキュリティ関連の計算の多くは乱数を使います。例えば暗号鍵の生成をするにも、まず材料となる乱数が必要になります。この乱数の生成をソフトウェアでなくハードウェアで実行することができれば、それだけ暗号処理を高速に行うことができるでしょう。

また、乱数の無作為性も大切です。乱数は暗号処理に使われていますので、攻撃者に見破られないことが大切です。FRDM-K64Fに搭載されているK64のReference Manualにも書かれていることですが、この疑似乱数(pseudorandom)アルゴリズムに与える初期値である種(seed)を工夫して攻撃者が予想できないものにすることで乱数や暗号の強度が高くなります。

こういった仕組みを搭載した乱数生成器(RNG)は、真性乱数生成器(TRNG、True Random Number Generator)などと表記されたりします。例えばSTM32F4のTRNGは、アナログ雑音という物理的現象を使って、より強い乱数を生成することができるように設計されています。

次に2.のハードウェア暗号化サポートについては、詳しく説明する必要はあまり無いでしょう。その名の通り、ハードウェア実装により記載されているアルゴリズムの実行をアクセラレートしてくれます。

前の記事を読む