wolfSSLのクイックスタート(コマンド編)

[wolfSSL](http://www.wolfssl.jp)はIoTデバイス、組み込み向け小型、軽量のSSL/TLSライブラリーです。ここでは、wolfSSLのダウンロード、ライブラリやサンプルプログラムのビルドから実行までの簡単な流れについて説明します。以下の説明では、Linux, MacOS, WidnowsのWSL, CygwinやminGWなどのコマンド環境を想定しています。

###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 `.'
```

２） ビルド
次に、ライブラリとサンプルプログラム一式をビルドします。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
============================================================================
```

3) インストール
最後にライブラリを所定の場所にインストールします。

```
$ 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接続と１往復のメッセージ送・受信の簡単な動作ですが、ユーザの作成したアプリケーションや既存のサーバサイトなどとの対向テストができるように各種のオプションを指定することができるようになっています。

同一ノード上で簡単なクライアント、サーバ間通信を確認するだけなら、それぞれのウィンドウを開いて次のようなコマンドをオプションなしで実行します。　./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として登録します。

![wireshark.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/dcc9c4c5-7caf-9c15-6ea3-17356c5a3fe7.jpeg)

サンプルサーバ、クライアントでは利用する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で通信していることが確認できます。



![wireshark-tls13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/cec52b39-c2b7-2c54-750b-ec3eb3b88963.jpeg)

サンプルの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