wolfTips: IoTデバイスのセキュリティライブラリ wolfSSL を使いこなすためのヒント集
--- 鍵、証明書編 ---
###概要
wolfSSLはIoTデバイス、組み込み向け小型、軽量のSSL/TLSライブラリーです。ここでは、wolfSSLでサーバ認証、クライアント認証、あるいは相互認証を実現するためのAPIをまとめます。
TLSでは、ハンドシェーク実行時に通信の相手方のなりすましなどがないことを確認するために公開鍵証明書を使ったサーバ認証、クライアント認証、あるは両方を認証する相互認証を行うことができます。パソコンのブラウザからのWebサーバへのアクセスでは通常サーバ認証のみを行うケースが多いですが、IoTデバイスではデバイス側のなりすましを防ぐためにクライアント認証を行うケースも多々あります。
上の図に示すように、例えばサーバ認証のためにはにTLS通信の前にサーバ認証を実行したいクライアント側に信頼するルートCAの証明書をおき、サーバ側にはCAの署名したサーバ証明書と対応する秘密鍵を置いておきます。クライアント認証はちょうどその逆で、サーバ側にCA証明書をおき、クライアント側が自分を証明するための証明書と秘密鍵を置いておきます。両方の認証を行うことを相互認証と呼びます。
wolfSSLではプログラム上でこれれを実現するためのAPIとして、表2のようにそれぞれの証明書や鍵をロードするためのAPIが提供されています。サーバ認証とクライアント認証はお互い対称なので、APIとしては3つのAPIがひと組だけ提供されていて、認証の方向によってサーバ、クライアントのどちらか適当なほうで利用します。ここでロードされた証明書、鍵がハンドシェーク時に参照され通信相手方の認証が行われます。これらの指定は、認証される側のAPIでは、一つのコンテクスト全体で共通のファイルを指定するためのAPI("wolfSSL_CTX_xxx")とセッションごとに異なるファイルを指定できるAPI("wolfSSL_xxx")の二種類が用意されています。
また、IoTデバイス、組込み系のシステムではファイルシステムが無いケースもあります。wolfSSLではそのような利用環境のために、ファイルイメージと同じものをメモリーバッファー上に置き、そのポインタとサイズを渡すようなインタフェースも提供されています。例えば、wolfSSL_load_verify_locationsに対してはwolfSSL_load_verify_bufferのように、wolfSSL_xxxに対してwolfSSL_xxx_bufferのようなネーミング規則となっています。
###まとめ
以上、wolfSSLのサーバ認証、クライアント認証のためのAPIについてまとめてみました。個々のAPI仕様についてはwolfSSL APPIレファレンスを参照してください。
ドキュメント:https://www.wolfssl.jp/docs/
英語サイト:https://www.wolfssl.com
日本語サイト:https://www.wolfssl.jp
Twitter: https://twitter.com/wolfSSL_Japan