wolfSSL クイックスタート

wolfSSL, Inc.
Version 3.9.0
wolfSSL クイックスタート
組み込み SSL/TLS ライブラリー wolfSSL(旧 CyaSSL) は、組み込みシステムや
RTOS 環境で最少のサイズ、最高の処理速度、すぐれた機能とポータビリティを実現する
C 言語ベースのライブラリーです。業界標準の TLS1.2/DTLS1.2 にいち早く対応、
OpenSSL 互換レイヤーを実現しながら、最小構成では openSSL の 20 分の 1 のサイズ
を実現しています。ChaCha20, Curve25519, NTRU, and Blake2b などの最新の暗号ア
ルゴリズムにも対応しています。シンプルな API と豊富な機能を両立させます。組み込み
用途だけでなくデスクトップやエンタプライズ・サーバまで広く使われているプラットフ
ォームでシームレスに動作します。
このクイックスタート・ガイドでは、基本的なインストールとセットアップ、さらに簡単
な使用例をご紹介します。より広範囲な紹介はマニュアルの参考リンクをご覧ください。
オープンソース・コミュニティによるたくさんの有用なリンクを利用することができま
す。
始める前に
必要なもの
-
make コマンド
Autoconf コマンド
C コンパイラ(gcc, clang)
オプション
-
git コマンド
Copyright 2016 wolfSSL Inc. All rights reserved.
-
C 言語に関する基本的知識
サーバ・クライアント通信に関する基本的知識
SSL/TLS に関する基本的知識
知っていればより簡単に進むことができます。SSL/TLS に関して、参考になるたくさん
の有益なリンクがあります。
インストールとコンパイル
wolfSSL ライブラリには autoconf と C コンパイラを使用する必要があります。wolfSSL
は多数のオペレーティングシステム上で動作します。ウィキペディアの wolfSSL の項目
をご参照ください。
コードを入手する
wolfSSL webpage または GitHub
からソースコードをダウンロードしてください。
Github レポジトリからダウンロードした場合は autogen.sh を実行する必要がります。
セットアップ
ソースコードをダウンロドしたら次のコマンドを wolfssl ディレクトリで実行してくださ
い。
./configure
make
sudo make install
./configure は wolfSSL にデフォルトを設定するために autoconf を使用しま
す。./configure コマンドのオプション詳細についてはマニュアルを参照してください。
make コマンドで wolfSSL ライブラリをコンパイルします。 sudo make install で
wolfSSL が共有ライブラリにインストールされます。これによって、アプリケーションの
ソース上で#include <wolfssl/ssl.h> し、コンパイル時に wolfSSL をリンクする(つまり
-lwolfssl を使用して)ことによって、どこからでも使用することができるようになりま
す。
これで準備完了です!
Copyright 2016 wolfSSL Inc. All rights reserved.
Hello, World! Server/Client サンプル
wolfSSL がコンパイル、リンクされ、wolfSSL の機能を使えるようになりました。ここ
では、wolfSSL を使った簡単なクライアント・サーバが安全な通信をする例をお見せしま
す。
client.c
#include <wolfssl/options.h>
#include <wolfssl/ssl.h>
#include <wolfssl/test.h>
#include <errno.h>
#define SERV_PORT 11111
int main()
{
int sockfd;
WOLFSSL_CTX* ctx;
WOLFSSL* ssl;
WOLFSSL_METHOD* method;
struct sockaddr_in servAddr;
const char message[] = "Hello, World!";
/* create and set up socket */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(SERV_PORT);
/* connect to socket */
connect(sockfd, (struct sockaddr *) &servAddr, sizeof(servAddr));
Copyright 2016 wolfSSL Inc. All rights reserved.
/* initialize wolfssl library */
wolfSSL_Init();
method = wolfTLSv1_2_client_method(); /* use TLS v1.2 */
/* make new ssl context */
if ( (ctx = wolfSSL_CTX_new(method)) == NULL) {
err_sys("wolfSSL_CTX_new error");
}
/* make new wolfSSL struct */
if ( (ssl = wolfSSL_new(ctx)) == NULL) {
err_sys("wolfSSL_new error");
}
/* Add cert to ctx */
if (wolfSSL_CTX_load_verify_locations(ctx, "certs/ca-cert.pem", 0) !=
SSL_SUCCESS) {
err_sys("Error loading certs/ca-cert.pem");
}
/* Connect wolfssl to the socket, server, then send message */
wolfSSL_set_fd(ssl, sockfd);
wolfSSL_connect(ssl);
wolfSSL_write(ssl, message, strlen(message));
/* frees all data before client termination */
wolfSSL_free(ssl);
wolfSSL_CTX_free(ctx);
wolfSSL_Cleanup();
}
このクライアントはデフォルトでは localhost のサーバのポート 11111 を呼び出しま
す。そして、暗号化された "Hello, World!"をサーバに送信した後、exit します。
Copyright 2016 wolfSSL Inc. All rights reserved.
server.c
#include <wolfssl/options.h>
#include <wolfssl/ssl.h>
#include <wolfssl/test.h>
#include <errno.h>
#define SERV_PORT 11111
#define MAX_LINE 4096
int main(int argc, char** argv)
{
int listenfd, connfd;
WOLFSSL_CTX* ctx;
WOLFSSL* ssl;
int n;
char buf[MAX_LINE];
WOLFSSL_METHOD* method;
/* Initialize wolfSSL library */
wolfSSL_Init();
/* Get encryption method */
method = wolfTLSv1_2_server_method();
/* Create wolfSSL_CTX */
if ( (ctx = wolfSSL_CTX_new(method)) == NULL)
err_sys("wolfSSL_CTX_new error");
/* Load server certs into ctx */
if (wolfSSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem",
Copyright 2016 wolfSSL Inc. All rights reserved.
SSL_FILETYPE_PEM) != SSL_SUCCESS)
err_sys("Error loading certs/server-cert.pem");
/* Load server key into ctx */
if (wolfSSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem",
SSL_FILETYPE_PEM) != SSL_SUCCESS)
err_sys("Error loading certs/server-key.pem");
tcp_accept(&listenfd, &connfd, NULL, SERV_PORT, 0, 0, 0);
/* Create wolfSSL object */
if ( (ssl = wolfSSL_new(ctx)) == NULL)
err_sys("wolfSSL_new error");
wolfSSL_set_fd(ssl, connfd);
if ( (n = wolfSSL_read(ssl, buf, (sizeof(buf) -1))) > 0) {
printf("%s\n", buf);
if (wolfSSL_write(ssl, buf, n) != n)
err_sys("wolfSSL_write error");
}
if (n <0)
printf("wolfSSL_read error = %d\n", wolfSSL_get_error(ssl, n));
else if (n == 0)
printf("Connection close by peer\n");
wolfSSL_free(ssl);
close(connfd);
wolfSSL_CTX_free(ctx);
wolfSSL_Cleanup();
exit(EXIT_SUCCESS);
}
Copyright 2016 wolfSSL Inc. All rights reserved.
サーバはポートにリクエストが来るまで待ち、受け取ったメッセージをプリントし、exit
します。このファイルをコンパイルするには、wolfSSL ライブラリを-lwolfssl オプショ
ンでリンクすることが大切です。これは、このコードとともに GitHub から入手できる
Makefile では自動的に取り扱われます。
注:エラーや期待しない状態に遭遇したら、マニュアル11章のチュートリアルを参照し
てください。
最小限の API
wolfSSL API のサブセットをご紹介します。これらの関数は新しいユーザにとってもっとの役に立つも
のと思います。さらなる情報に関しては公式マニュアルを参照してください。
-
int wolfSSL_Init(void)
wolfSSL ライブラリを初期化します。アプリケーションの中でその他のライブラリ呼び出しの前に一回
だけ呼び出します。
-
WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
この関数は、SSL/TLS プロトコル・メソッドを入力として、一つの SSL コンテクストを生成します。,
-
WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
この関数は、生成されたコンテクストを入力として、一つの SSL セッションを生成します。
-
int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
この関数はファイルディスクリプタ(fd) を SSL 接続のための送受信機能としてアサインします。たいて
いの場合、これはソケット・ファイルディスクリプタになります。
Copyright 2016 wolfSSL Inc. All rights reserved.
-
WOLFSSL_METHOD* wolfTLSv1_2_client_method()
この関数は、アプリケーションはクライアント側で、TLS1.2 プロトコルだけをサポートすることを示す
ために使われます。この関数は、wolfSSL_CTX_new で SSL/TLS コンテクストを生成するための
WOLFSSL_METHOD 構造体をアロケートします。
-
WOLFSSL_METHOD* wolfTLSv1_2_server_method()
この関数は、アプリケーションはサーバ側で、TLS1.2 プロトコルだけをサポートすることを示すために
使われます。この関数は、wolfSSL_CTX_new で SSL/TLS コンテクストを生成するための
WOLFSSL_METHOD 構造体をアロケートします。
-
int wolfSSL_connect(WOLFSSL* ssl)
この関数はクライアント側で、サーバとの SSL/TLS ハンドシェイクの初期化のために呼び出されます。
この関数が呼び出される時には、使用する通信チャネルはすでにセットアップされている必要がありま
す。
-
void wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
この関数は、サイズ sz バイトのバッファーからのデータを SSL 接続に送信します。ハンドシェイクがま
だ実行されていない場合は、wolfSSL_connect() または wolfSSL_accept()関数で SSL/TLS セッショ
ンをネゴシエートします。
-
void wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
この関数は、サイズ sz バイトのデータを SSL セッション(ssl)の内部バッファから指定されたバッファに
受信します。読み出されたバイト分は内部バッファから消去されます。
-
void wolfSSL_free(WOLFSSL* ssl)
この関数はアロケートされた WOLFSSL を解放します。
Copyright 2016 wolfSSL Inc. All rights reserved.
-
void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
この関数は、アロケートされた WOLFSSL_CTX オブジェクトを解放します。この関数は、CTX 参照数
をデクレメントし、参照数がゼロになった場合だけにコンテクストを解放します。
-
void wolfSSL_Cleanup(void)
wolfSSL をそれ以上の使用から Un-initialize します。この関数は必ず呼び出す必要はありませんが、ラ
イブラリーで使用されている資源を解放します。
-
int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file, int format)
この関数は、証明書ファイルを SSL context (WOLFSSL_CTX)に読み込みます。フィアルは file アー
ギュメントで指定されます。format アーギュメントはファイル・フォーマットのタイプ
SSL_FILETYPE_ASN1 か SSL_FILETYPE_PEM かを指定します。使用方法に関してはサンプルを参
照してください。
-
int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file, int format)
この関数は、プライベート
ファイルを SSL コンテクスト(WOLFSSL_CTX)に読み込みます。読み込む
フィアルは file アーギュメントで指定します。format アーギュメントはファイル・フォーマットのタイ
プ SSL_FILETYPE_ASN1 か SSL_FILETYPE_PEM かを指定します。使用方法に関してはサンプルを
参照してください。
FAQ
echoclient と echoserver は Visual Studio でも使えますか?
echoserver と echoclient は wolfSSL ソースコードの examples ディレクトリの下にあります。詳しくは、
チュートリアルのリンクを参照してください
Copyright 2016 wolfSSL Inc. All rights reserved.
Configure コマンドのオプションについて
--enable-opensslextra は OpenSSL 互換層を有効化し、wolfSSL の機能を openSSL の名前で提供しま
す。
--enable-pwdbased はパスワード・ベースの暗号化を有効かします。この機能は opensslextra ペアでよ
く使われます。
--enable-dtls, これは UDP 通信に便利な DTLS 機能を有効化します。あるいは、wolfSSL サンプルを実行し
てみてください。
Configure コマンドのオプションについてはマニュアル2.5章を参照してください。
クロスコンパイルについて
クロスコンパイルには、./configure に対して host を指定してください。例えば、次のように:
./configure --host=arm-linux
次のような、コンパイラ、リンカーの指定も必要かもしれません:
./configure --host=arm-linux CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux
クロスコンパイルについては、マニュアル 2.6 章を参照してください。
参照リンク:
wolfSSL 使用のため、あるいはネットワーク・セキュリティ一般について参照できるリンクがあります。
wolfSSL マニュアル第11章には、より広汎なチュートリアルがあります。wolfSSL パッケージとログラムと
第 11 章のサンプルプ・プログラムは適切なエラーチェックも行っているので、参照してください。より広汎な
API についてはマニュアル第17章を参照してください。
Copyright 2016 wolfSSL Inc. All rights reserved.
wolfSSL Manual
wolfSSL Wikipedia Page
Comparison of TLS Libraries Wikipedia Page
OSI model Wikipedia page
Visual Studio Tutorial
wolfSSL GitHub
Copyright 2016 wolfSSL Inc. All rights reserved.