wolfSSLはIoTデバイス、組み込み向け小型、軽量のSSL/TLSライブラリーです。ここでは、wolfSSLのダウンロード、ライブラリやサンプルプログラムのビルドから実行までの簡単な流れについて説明します。以下の説明では、Linux, MacOS, WidnowsのWSL, CygwinやminGWなどのコマンド環境を想定しています。
###1. ダウンロード、ビルド、インストール
1) ソースコード一式のダウンロード
正式版はwolfSSLサイトから、最新版はGithubからダウンロードします。
正式版:
https://www.wolfssl.jp/download/ からwolfssl-x.x.0.zip を選択してダウンロード、解凍します。
最新版:
https://github.com/wolfssl/wolfssl からcloneします。cloneの後、wolfsslデイレクトリでsh autogen.shを実行しconfigureなど必要ファイルを生成します。
$ git clone https://github.com/wolfssl/wolfssl
Cloning into 'wolfssl'...
remote: Enumerating objects: 5, done.
...
Resolving deltas: 100% (64503/64503), done.
$ cd wolfssl
$ sh autogen.sh
autoreconf: Entering directory `.'
...
parallel-tests: installing 'build-aux/test-driver'
autoreconf: Leaving directory `.'
2) ビルド
次に、ライブラリとサンプルプログラム一式をビルドします。configureコマンドでMakefileを生成し、makeコマンドにてビルドします。configureコマンドはとりあえずアーギュメントなしのデフォルトでビルドします。make checkのように指定するとコンパイル完了後、ローカルテストを実行するのですべてのテストが正常終了することを確認します。
$ ./configure
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
...
* Linux AF_ALG: no
* Linux devcrypto: no
* Crypto callbacks: no
---
$ make check
/Applications/Xcode.app/Contents/Developer/usr/bin/make -j17 check-am
CC wolfcrypt/benchmark/benchmark.o
CC wolfcrypt/src/src_libwolfssl_la-hmac.lo
...
PASS: scripts/tls13.test
PASS: tests/unit.test
============================================================================
Testsuite summary for wolfssl 4.4.1
============================================================================
# TOTAL: 7
# PASS: 7
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
============================================================================
- インストール
最後にライブラリを所定の場所にインストールします。
$ sudo make install
Password:
###2. サンプルプログラムの実行
ここまでの手順で、ライブラリーと同時に各種サンプルプログラムがビルドされるので、代表的なものの使い方を説明します。
暗号アルゴリズムの単体テスト。このテストは上記の "make check" 時にも実行されているのでここでエラーが発生する可能性はあまりありませんが、念のため実行させて必要な暗号アルゴリズムが組み込まれているかどうか確認します。
$ ./wolfcrypt/test/testwolfcrypt
------------------------------------------------------------------------------
wolfSSL version 4.4.0
------------------------------------------------------------------------------
error test passed!
MEMORY test passed!
base64 test passed!
asn test passed!
RANDOM test passed!
MD5 test passed!
SHA test passed!
SHA-224 test passed!
SHA-256 test passed!
...
製品には暗号アルゴリズムごとのベンチマークプログラムも含まれているので、簡単に処理速度を知ることができます。
$ ./wolfcrypt/benchmark/benchmark
------------------------------------------------------------------------------
wolfSSL version 4.4.0
------------------------------------------------------------------------------
wolfCrypt Benchmark (block bytes 1048576, min 1.0 sec each)
RNG 130 MB took 1.003 seconds, 129.651 MB/s Cycles per byte = 16.95
AES-128-CBC-enc 310 MB took 1.010 seconds, 306.836 MB/s Cycles per byte = 7.16
AES-128-CBC-dec 295 MB took 1.002 seconds, 294.514 MB/s Cycles per byte = 7.46
AES-192-CBC-enc 245 MB took 1.000 seconds, 244.895 MB/s Cycles per byte = 8.97
...
また、TLSレイヤーのベンチマークを実行することができます。その場合、サーバ側、クライアン側別々のウィンドウを開いて以下のように実行すると、同じノード上で通信した場合のコネクション時間、メッセージ送・受信時間を組み込まれている暗号スイートごとに知ることができます。
サーバ側: "-s"オプションで起動
$ ./examples/benchmark/tls_bench -s
Running TLS Benchmarks...
Side Cipher Total Bytes Num Conns Rx ms Tx ms Rx MB/s Tx MB/s Connect Total ms Connect Avg ms
Server DHE-RSA-AES128-SHA 25690112 99 217.130 71.566 56.418 171.170 659.365 6.660
Side Cipher Total Bytes Num Conns Rx ms Tx ms Rx MB/s Tx MB/s Connect Total ms Connect Avg ms
Server DHE-RSA-AES256-SHA 22806528 88 243.887 80.250 44.590 135.514 621.015 7.057
...
クライアント側: "-c"オプションで起動
$ ./examples/benchmark/tls_bench -c
Running TLS Benchmarks...
Side Cipher Total Bytes Num Conns Rx ms Tx ms Rx MB/s Tx MB/s Connect Total ms Connect Avg ms
Client DHE-RSA-AES128-SHA 25690112 99 227.376 71.908 53.876 170.355 663.001 6.697
Side Cipher Total Bytes Num Conns Rx ms Tx ms Rx MB/s Tx MB/s Connect Total ms Connect Avg ms
Client DHE-RSA-AES256-SHA 22806528 88 254.044 81.635 42.808 133.214 624.196 7.093
...
また、接続先、ポートを指定することもできるので (-h, -pオプション)、異なるノード間でベンチマークすることもできます。
$ ./examples/benchmark/tls_bench -c -h 127.0.0.1
TLSサーバ、クライアントのサンプルプログラムは、TLS接続と1往復のメッセージ送・受信の簡単な動作ですが、ユーザの作成したアプリケーションや既存のサーバサイトなどとの対向テストができるように各種のオプションを指定することができるようになっています。
同一ノード上で簡単なクライアント、サーバ間通信を確認するだけなら、それぞれのウィンドウを開いて次のようなコマンドをオプションなしで実行します。 ./certsディレクトリ下には、テスト用の各種サンプル証明書、鍵も同梱されていて、デフォルトでは下記のようなサンプル証明書、鍵が使用されます。
[Server]
サーバー側証明書: ./certs/server-cert.pem
サーバー側秘密鍵: ./certs/server-key.pem
サーバー側のクライアント認証用自己証明書 ./certs/client-cert.pem
[Client]
クライアント側証明書: ./certs/client-cert.pem
クライアント側秘密鍵: ./certs/client-key.pem
クライアント側のサーバ認証用CA証明書: ./certs/ca-cert.pem
サーバ側:
$ ./examples/server/server
SSL version is TLSv1.2
SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
SSL curve name is SECP256R1
Client message: hello wolfssl!
クライアント側:
$ ./examples/client/client
SSL version is TLSv1.2
SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
SSL curve name is SECP256R1
I hear you fa shizzle!
この時、Wiresharkでパケットをキャプチャーすれば、このようにハンドシェークやメッセージ送・受信の様子を確認できます。このサンプルはポート "11111" を使っているので、Analyze -> Decode As でこのポートをSSLとして登録します。
サンプルサーバ、クライアントでは利用するTLSのバージョンを指定できるので、試しにTLS1.3 (-v 4) を指定してみます。(旧バージョンでは "./configure --enable-tls13" のように、TLS1.3機能を明示的に有効化しておきます。)
$ ./examples/server/server -v 4
SSL version is TLSv1.3
SSL cipher suite is TLS_AES_128_GCM_SHA256
SSL curve name is SECP256R1
Client message: hello wolfssl!
$ ./examples/client/client -v 4
SSL version is TLSv1.3
SSL cipher suite is TLS_AES_128_GCM_SHA256
SSL curve name is SECP256R1
I hear you fa shizzle!
WiresharkのキャプチャーでもTLS1.3で通信していることが確認できます。
サンプルのserver/clientは同一ノード上だけではなく、他のノードとの接続も可能です。サーバの場合、外部からアクセス可能となるように"-b"でバインドを指定します。また、クライアント認証をしない場合は"-d"を指定します。
$ ./examples/server/server -b -d
クライアントも、"-h"でホストドメイン,"-p"でポートを指定することができます。外部のWebサーバをアクセスする場合は、さらに"-A"でサーバ認証のためのCA証明書を指定、"-g" で送信メッセージとして簡単なHTTP GET要求を出すように指定します。
$ ./examples/client/client -h www.wolfssl.jp -p 443 -A ./certs/wolfssl-website-ca.pem -g
SSL version is TLSv1.2
SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
SSL curve name is SECP256R1
...
さらに詳細は "-?" オプションでヘルプメッセージを見ることができます。
##3. まとめ
今回は、wolfSSLのクイックスタートについて簡単にまとめてみました。詳細なドキュメント、製品情報については、wolfSSLの下記を参照してください。wolfSSLは、ソフトウェアの内容は同じですが無償のオープンソース版と有償商用版のデュアルライセンスとなっています。社内技術評価などにはオープンソース、製品への組み込みの際は商用ライセンス契約をお願いしています。
ドキュメント:https://www.wolfssl.jp/docs/
英語サイト:https://www.wolfssl.com
日本語サイト:https://www.wolfssl.jp
Twitter: https://twitter.com/wolfSSL_Japan