概要
wolfSSLのコンソールツール、wolfCLU について紹介します。wolfCLUは、wolfSSLのポータブルコマンドラインツールです。wolfCLU は、一般的な暗号化処理、例えば証明書の解析、暗号化鍵の生成などを、一からアプリケーションを書くよりも容易に行ってくれます。単純な暗号操作だけしか必要がない場合や、OpenSSLがインストールされていない組み込み機器でコマンドラインによる操作が必要な場合に最適です。
wolfCLU の最新安定バージョンv0.0.8
では次表のようなコマンドをサポートしています。
コマンド名 | 備考 |
---|---|
BENCH | 暗号処理のベンチマーク |
CRL | CRLファイルの検証。CRLファイルをDER又はPEM形式へ変換 |
DGST | 署名検証 |
ECPARAM | ECC鍵の作成 |
ENC | 暗号化または復号化処理 |
GENKEY | RSA, ECC及びED25519鍵の作成 |
HASH | ハッシュ値の生成 |
MD5 | MD5ハッシュ値の生成 |
PKCS12 | PCKS12の解析のみサポート |
PKEY | 鍵情報を標準出力へ出力 |
RAND | ランダム値をRawデータまたはbase64で出力 |
REQ | 証明書の署名リクエストの生成または自己署名証明書の生成 |
RSA | RSA暗号処理 |
S_CLIENT | 基本的なTLS接続 |
VERIFY | X509証明書の検証 |
X509 | X509証明書の解析と出力 |
各コマンドにはそれぞれオプションが複数含まれます。オプションについては英語になりますが、wolfCLU マニュアルで確認することが出来ます。
今回は、wolfCLU をもちいて自己署名証明(俗に言うオレオレ証明書)を作成しTLS通信を行ってみます。使用するコマンドは上記表の ECPARAM
、REQ
及び X509
コマンドを使用します。
ダウンロード、ビルド、インストール
1. wolfSSL のソースコード取得とビルド
最新コードを github から取得します。
$git clone --depth 1 https://github.com/wolfSSL/wolfssl
コンフィグレーションに "--enable-wolfclu"オプションを指定し、CLU 機能を wolfSSL に組み込み、システムへインストールします。
$ ./autogen.sh
$ ./configure --enable-wolfclu
$ make && make check
$ sudo make install
2. wolfCLU のソースコード取得とビルド
2.1 wolfCLU のソースコード取得
github から最新版を clone します。
git clone https://github.com/wolfSSL/wolfCLU
2.2 wolfCLU のビルド
以下のコマンドを使って wolfCLU をビルドします。
$./autogen.sh
$./configure
$make && make check
$sudo make install
正常にビルドが終了すると wolfCLU ルートフォルダに wolfssl
が作成されます。
$ ls -al wolfssl
-rwxrwxr-x 1 foo foo 1244224 Jul 28 18:03 wolfssl
コマンドプロンプトにて次のコマンドを入力し、正常に wolfCLU がビルドされていることを確認します。
$wolfssl -h
3. 自己署名証明の作成
最初に証明書にサインするECC秘密鍵を、wolfCLU の ECPARAM
コマンドで作成します。楕円曲線として secp384r1
を指定します。鍵を ecc.key
として出力します。
$wolfssl ecparam -genkey -out ecc.key -name secp384r1
$ cat ecc.key
-----BEGIN EC PARAMETERS-----
BgUrgQQAIg==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDCA+l1+SfMMRggymjJTdX93FwTdDdUEUhUJrNajEmthCv7gqglgAHkb
Dm9bVvDrTgmgBwYFK4EEACKhZANiAATiJXEouK4YVfYT/WmIn3U6hXh5Xce+/PGK
nTUnLs+m3SgKLnsOkxHhKz/JBVLM9NxLOuDAdLIRXm7X9F6YmBSrzgYM1orezxiS
6ksaefyH6NleVoI+cx96f86tz4oCWZg=
-----END EC PRIVATE KEY-----
次に REQ
コマンドを用いて自己署名証明書を作成します。次のコマンドを入力します。
各オプションは次のような働きをします。
new
オプション指定で新規作成
x509
オプション指定で自己署名証明書を指定
days
オプション指定で有効期限を 3650
日
key
オプション指定で証明書に含める公開鍵を先ほど作成した ecc.key
を指定
out
オプション指定で出力先を ecc-self.pem
に指定
outform
オプション指定で出力形式をPEMに指定
sha256
オプション指定で署名用のハッシュアルゴリズムをsha256
を指定
コマンド入力に引き続いて作成者の情報入力をもとめられますので、適当に入力します。
$ wolfssl req -new -x509 -days 3650 -key ecc.key -out ecc-self.pem -outform PEM -sha256
Enter without data will result in the field being skipped.
Examples of inputs are provided as [*]
Country [US] : JP
State or Province [Montana] : KUMAMOTO
Locality [Bozeman] : KUMAMOTO
Organization Name [wolfSSL] : wolfSSL
Organization Unit [engineering] : engineering
Common Name :
Email Address :
作成した証明書は、X509
コマンドを使用し内容を確認することが出来ます。
$ wolfssl x509 -in ecc-self.pem -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
24:c8:cc:d4:30:cf:94:2a:b2:01:de:39:fe:32:fe:af
Signature Algorithm: SHA256wECDSA
Issuer: /C=JP/ST=KUMAMOTO/L=KUMAMOTO/O=wolfSSL/OU=engineering
Validity
Not Before: Jul 30 01:36:33 2022 GMT
Not After : Jul 27 01:36:33 2032 GMT
Subject: /C=JP/ST=KUMAMOTO/L=KUMAMOTO/O=wolfSSL/OU=engineering
Subject Public Key Info:
Public Key Algorithm: EC
Public-Key: (384 bit)
pub:
04:e2:25:71:28:b8:ae:18:55:f6:13:fd:69:88:9f:
75:3a:85:78:79:5d:c7:be:fc:f1:8a:9d:35:27:2e:
cf:a6:dd:28:0a:2e:7b:0e:93:11:e1:2b:3f:c9:05:
52:cc:f4:dc:4b:3a:e0:c0:74:b2:11:5e:6e:d7:f4:
5e:98:98:14:ab:ce:06:0c:d6:8a:de:cf:18:92:ea:
4b:1a:79:fc:87:e8:d9:5e:56:82:3e:73:1f:7a:7f:
ce:ad:cf:8a:02:59:98
ASN1 OID: SECP384R1
X509v3 extensions:
Signature Algorithm: SHA256wECDSA
30:66:02:31:00:cc:7c:fe:84:ac:bf:39:f3:95:a9:38:e9:7b:
a5:7e:e9:2e:df:b5:6f:23:b5:1e:84:45:2e:97:01:2d:98:59:
0a:39:1f:fc:51:d6:32:57:46:58:99:6d:ea:7b:d1:49:e1:02:
31:00:cf:37:68:ad:bc:fa:13:28:46:98:67:1e:77:51:02:1b:
99:f3:00:34:24:36:e0:9a:53:c5:bd:5a:54:13:27:d1:92:8b:
46:fd:f4:40:22:10:bc:35:e4:aa:f7:44:ed:6d
-----BEGIN CERTIFICATE-----
MIIB8DCCAXWgAwIBAgIQJMjM1DDPlCqyAd45/jL+rzAKBggqhkjOPQQDAjBbMQsw
CQYDVQQGEwJKUDERMA8GA1UECAwIS1VNQU1PVE8xETAPBgNVBAcMCEtVTUFNT1RP
MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtlbmdpbmVlcmluZzAeFw0yMjA3
MzAwMTM2MzNaFw0zMjA3MjcwMTM2MzNaMFsxCzAJBgNVBAYTAkpQMREwDwYDVQQI
DAhLVU1BTU9UTzERMA8GA1UEBwwIS1VNQU1PVE8xEDAOBgNVBAoMB3dvbGZTU0wx
FDASBgNVBAsMC2VuZ2luZWVyaW5nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4iVx
KLiuGFX2E/1piJ91OoV4eV3Hvvzxip01Jy7Ppt0oCi57DpMR4Ss/yQVSzPTcSzrg
wHSyEV5u1/RemJgUq84GDNaK3s8YkupLGnn8h+jZXlaCPnMfen/Orc+KAlmYMAoG
CCqGSM49BAMCA2kAMGYCMQDMfP6ErL8585WpOOl7pX7pLt+1byO1HoRFLpcBLZhZ
Cjkf/FHWMldGWJlt6nvRSeECMQDPN2itvPoTKEaYZx53UQIbmfMANCQ24JpTxb1a
VBMn0ZKLRv30QCIQvDXkqvdE7W0=
-----END CERTIFICATE-----
4. 自己署名証明書を使ってTLS通信してみる
wolfSSL に含まれるサンプルサーバ・クライアントを利用し、ステップ 3 で作成した自己証明書を使ってTLS通信してみます。別のターミナルを開き、wolfSSLのルートフォルダーへ移動し、サンプルサーバを起動します。
$ cd <wolfssl-root>
$ ./examples/server/server -b -i -d -c <wolfCLU-root>/ecc-self.pem -k <wolfCLU-root>/ecc.key
さらに別のターミナルを開き、サンプルクライアントを起動します。
$ ./examples/client/client -A <wolfCLU-root>/ecc-self.pem
サンプルサーバの出力を確認します。
//出力例
$ ./examples/server/server -b -i -d -c <wolfCLU-root>/ecc-self.pem -k <wolfCLU-root>ecc.key
peer has no cert!
SSL version is TLSv1.2
SSL cipher suite is TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
SSL signature algorithm is (null)
SSL curve name is SECP384R1
Server Random : 61B93116574990092DD8678948E13FF65F4902AE3713D624E402ADB0DFEE7BFC
Client message: hello wolfssl!
サンプルクライアントの出力を確認します。
$ ./examples/client/client -A /home/miyazakh/workspace/wolfCLU/ecc-self.pem
Session Ticket CB: ticketSz = 172, ctx = initial session
Alternate cert chain used
issuer : /C=JP/ST=KUMAMOTO/L=KUMAMOTO/O=wolfSSL/OU=engineering
subject: /C=JP/ST=KUMAMOTO/L=KUMAMOTO/O=wolfSSL/OU=engineering
serial number:46:0a:e0:5e:f8:4a:f4:dc:31:f7:74:e0:33:64:e7:f4
SSL version is TLSv1.2
SSL cipher suite is TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
SSL curve name is SECP384R1
---
Server certificate
-----BEGIN CERTIFICATE-----
....
TLS通信を行っていることが分かります。
まとめ
今回は、wolfSSL のポータブルコマンドラインツールである wolfCLU について紹介しました。現在の最新安定バージョンは、v0.0.8 で、まだまだ進化の途上である感は否めません。一方で github 版の最新コードは定期的に更新され機能も充実してきてるので、実験的に試すにはお勧めです。