昨今、セキュアな通信において楕円曲線暗号(ECC)を用いられるケースが増えてきました。今回は、その中でもビットコイン・ブロックチェーンで用いられたことで有名となったsecp256k1曲線を取り上げます。
secp256k1のサポートを有効にしてwolfSSLをビルドし、その曲線を使用してECC証明書を生成、wolfSSLのサンプルクライアントとサーバーでTLS接続で使用するまでの手順をご説明します。
ステップ1:secp256k1サポートを有効化しwolfSSLをビルド
wolfSSLリポジトリをクローンし、カスタム曲線と証明書生成サポートでビルドすることから始めます。
# https://www.wolfssl.jp/download/からwolfsslをダウンロード
cd wolfssl
./configure --enable-ecccustcurves=all --enable-keygen --enable-certgen --enable-certreq --enable-certext
make
sudo make install
ステップ2:secp256k1証明書を生成
次に、wolfSSLのexamplesリポジトリからcertgenサンプルを取得します。
git clone https://github.com/wolfssl/wolfssl-examples
cd wolfssl-examples/certgen
secp256k1を使用するようサンプルを修正
certgen_example.cを開き、secp256k1を使用して鍵を生成するよう、次のように修正します。
- ret = wc_ecc_make_key(&rng, 32, &newKey);
+ ret = wc_ecc_make_key_ex(&rng, 32, &newKey, ECC_SECP256K1);
PEM形式での鍵出力
秘密鍵をファイルに書き込むために、証明書生成後に以下のブロックを追加します。この際、必ずエラーハンドリングを実施してください。
derBufSz = wc_EccKeyToDer(&newKey, derBuf, LARGE_TEMP_SZ);
pemBufSz = wc_DerToPem(derBuf, derBufSz, pemBuf, LARGE_TEMP_SZ, ECC_PRIVATEKEY_TYPE);
if (pemBufSz < 0) goto exit;
file = fopen("newCert.key", "wb");
if (!file) goto exit;
ret = (int)fwrite(pemBuf, 1, pemBufSz, file);
fclose(file);
ビルドと実行
make
./certgen_example
これで、secp256k1を使用したnewCert.pemとnewCert.keyファイルができます。
ステップ3:secp256k1用にクライアント/サーバーを設定
wolfsslディレクトリに戻り、secp256k1曲線をサポートするようにクライアントサンプルを修正します。
+++ b/examples/client/client.c
@@ -3707,6 +3707,9 @@
#endif
+
+ wolfSSL_CTX_UseSupportedCurve(ctx, WOLFSSL_ECC_SECP256K1);
+
#if defined(HAVE_SUPPORTED_CURVES)
サーバーとクライアントを実行
まずは生成された証明書/鍵を使用してサーバーを起動し、続いて信頼できるCA証明書をロードしたクライアントを起動します。
./examples/server/server -d -c newCert.pem -k newCert.key
./examples/client/client -A ./certs/ca-ecc-cert.pem
すべてが正しく設定されていれば、以下のような出力が表示されます。
SSL version is TLSv1.2
SSL cipher suite is TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
SSL curve name is SECP256K1
I hear you fa shizzle!
これで、任意のECC曲線を有効化してwolfSSLをビルドし、secp256k1を使用して証明書を生成、TLSセッションで正常に使用できることを確認できました。
ご質問がございましたら、ぜひ info@wolfssl.jp までお問い合わせください。
原文:https://www.wolfssl.com/using-secp256k1-with-wolfssl-a-step-by-step-guide