OpenSSL API によるセキュア・プログラミング: 第 1 回 API の概要

基本的なセキュア接続と非セキュア接続を作成する

OpenSSL はセキュアな通信のための最もよく知られたオープン・ライブラリーですが、その API の使い方を学ぶのは一筋縄では行きません。それは、マニュアルの記述が不十分なためです。その欠落している部分をこの記事の情報で補って、API を使いこなせるようになってください。この記事では、基本的な接続をセットアップした後、OpenSSL の BIO ライブラリーを使用して、セキュアな接続をセットアップする方法、非セキュアな接続をセットアップする方法の両方を解説します。さらに、エラーの検出方法についても簡単に説明します。

2012年 6月 28日 ― 「ダウンロード」から入手できる記事のサンプル・コードに、有効なリンクが追加されました。

Kenneth Ballard, Software Engineer, MediNotes Corp.

Kenneth は、アイオワ州 West Des Moines 所在の MediNotes Corp. に勤務するソフトウェア・エンジニアです。ネブラスカ州 Peru の Peru State College で経営管理学の理学士号を取得しています。また、アイオワ州 Creston の Southwestern Community College では、コンピューター・プログラミングの理系準学士の資格も取得しています。彼は複数のアプリケーションおよびプログラム・ライブラリーを作成しています。



2012年 12月 06日

OpenSSL API のマニュアルは、記述が少し不明瞭です。その上、OpenSSL の使用方法に関するチュートリアルも数多くは存在しないことから、アプリケーションで OpenSSL を機能させるのは、初めての人にとっては若干厄介な作業になりかねません。そんな状況のなか、OpenSSL を使用して基本的なセキュア接続を実装するにはどうすればよいのでしょうか?この記事は、その問題を解決するためのガイドです。

OpenSSL の実装方法を学ぶ上での問題として、マニュアルが完全ではないということがあります。API マニュアルが不完全だと、一般に開発者はその API を使用したがりません。これは通常、その API がいずれ消滅することを意味します。けれども、OpenSSL は今でも健在であり、根強く使用されています。その理由は何なのでしょうか?

OpenSSL は、セキュアな通信のための最もよく知られたオープン・ライブラリーです。Google で「SSL ライブラリ」と入力して検索すると、検索結果の先頭に OpenSSL がリストアップされます。OpenSSL は、Eric Young 氏と Tim Hudson 氏によって開発された SSLeay ライブラリーを基に、1998年に誕生しました。SSL ツールキットには、他にも GNU General Public License の下で配布される GNU TLS や、Mozilla NSS (Network Security Services) などがあります (詳細については、この記事の「参考文献」を参照してください)。

GNU TLS、Mozilla NSS、そしてその他のすべてのライブラリーに勝る OpenSSL の利点としては、ライセンスが挙げられます (「参考文献」を参照)。さらに、GNU TLS に関して言うと、(これまでのところ) サポートされているのは TLS v1.0 および SSL v3.0 プロトコルに限られます。

Mozilla NSS は Mozilla Public License と GNU GPL のデュアル・ライセンスの下で配布されており、開発者がどちらかを選べるようになっています。けれども、Mozilla NSS のサイズは OpenSSL を上回り、このライブラリーを構成するには他の外部ライブラリーが必要です。それとは対照的に、OpenSSL には必要なものがすべて含まれています。しかも、OpenSSL と同じく、NSS API の大部分はドキュメント化されていません。ただし、Mozilla NSS は、スマート・カードなどの暗号トークンに使用される PKCS #11 のサポートを備えていますが、OpenSSL にはこのサポートはありません。

前提条件

  • この記事を最大限に活用するための条件は以下のとおりです。
  • C プログラミングに習熟していること
  • インターネット通信およびインターネット対応アプリケーションの作成方法を十分に理解していること

SSL については後で簡単に説明するので、必ずしも SSL に精通している必要はありませんが、興味がある方のために、「参考文献」セクションに、SSL の詳細を説明している記事へのリンクを記載してあります。暗号に関する知識も役立ちますが、必須ではありません。

SSL とは何か?

SSL は、セキュア・ソケット・レイヤー (Secure Sockets Layer) の頭字語です。SSL はインターネットでのセキュアな通信のための標準であり、プロトコルにデータの暗号化を統合するものです。データはコンピューターから送信される前に暗号化され、目的の宛先に到着してからでないと復号されません。この仕組み全体を背後で支えるのは、証明書と暗号化アルゴリズムです。OpenSSL を使用すれば、この両方を扱うことができます。

理論上、データが暗号化されていれば、宛先に到達する前にデータが傍受されたり、盗聴されたりしても、そのデータを解読することは不可能です。けれども毎年のようにコンピューターの処理が高速になり、暗号解読が新たに進歩するにつれ、SSL で使用される暗号化プロトコルが解読される可能性は大きくなってきています。

SSL とセキュア接続は、プロトコルが HTTP、POP3、FTP のどれであろうと、インターネット上のあらゆる種類のプロトコルに使用することができます。さらに、SSL はセキュアな Telnet セッションに使用することもできます。SSLを使えば、どの接続でもセキュアにすることができますが、あらゆる種類の接続に SSL を使用する必要はありません。SSL を使用する必要があるのは、その接続によって機密情報を伝送する場合です。


OpenSSL とは何か?

OpenSSL は単なる SSL ではありません。メッセージ・ダイジェスト、ファイルの暗号化と復号、デジタル証明書、デジタル署名、そして乱数に対応することができます。OpenSSL ライブラリーに関しては、1 本の記事では到底取り上げられないほどの実に多くの話題があります。

OpenSSL は単なる API でもありません。これは、コマンドライン・ツールでもあります。コマンドライン・ツールでは API と同じ内容の処理を実行できるだけでなく、さらに一歩進んで SSL サーバーおよび SSL クライアントをテストすることもできます。また、コマンドライン・ツールからは、開発者が OpenSSL の機能の概要をつかめます。OpenSSL コマンドライン・ツールの使用方法については、「参照文献」セクションを参照してください。


必要となるもの

第一に必要となるのは、最新バージョンの OpenSSL です。最新のソース・コードを入手して自分でコンパイルする場合も、コンパイルに時間をかけずに最新バージョンのバイナリー・ライブラリーを入手する場合も、「参考文献」セクションでその入手先を参照してください。セキュリティーのためには、最新のソース・コードをダウンロードして自分でコンパイルすることをお勧めします。一般に、バイナリー・ディストリビューションは OpenSSL の開発者ではなく、サード・パーティーによってコンパイルされて配布されます。

一部の Linux ディストリビューションには、OpenSSL のバイナリー・コードが付属しています。バイナリー・コードは、このライブラリーの使用方法を学ぶには役立ちますが、本番で使用する予定の場合には、必ず最新バージョンを入手して、最新の状態に維持してください。

RPM からインストールした Linux ディストリビューション (Red Hat、Mandrake など) については、そのディストリビューションのメーカーから入手できる RPM パッケージを使用して OpenSSL ディストリビューションを更新することをお薦めします。セキュリティー上の理由により、ご使用のディストリビューションを最新のバージョンにアップグレードすることもお薦めします。ご使用のディストリビューションで OpenSSL の最新バージョンを使用できない場合、上書きするファイルはライブラリーだけにして、実行ファイルは上書きしないようにしてください。この詳細については、OpenSSL に付属の FAQ ドキュメントに記載されています。

もう 1 つ注意する点として、OpenSSL はすべてのプラットフォームで公式にサポートされているわけではありません。できる限りクロスプラットフォーム対応にするための取り組みが行われていますが、コンピューターやオペレーティング・システムによっては、OpenSSL が動作しない可能性があります。サポートされているプラットフォームについては、OpenSSL の Web サイト (「参考文献」からリンクできます) を参照してください。

OpenSSL を使用することを計画している場合で、証明書要求を行ってデジタル証明書を作成するには、構成ファイルを作成する必要があります。そのような場合に備え、OpenSSL パッケージの apps フォルダーには、openssl.cnf という名前のテンプレート・ファイルが用意されています。このテンプレート・ファイルは、この記事の内容には必要ないので説明を省きますが、このテンプレート・ファイルには極めて丁寧に注釈が付けられています。また、インターネットで検索すると、このファイルの変更について説明しているチュートリアルが数多く見つかります。


ヘッダーおよび初期化

このチュートリアルで使用するヘッダーは、ssl.h、bio.h、および err.hの 3 つだけです。これらのヘッダーはすべて openssl サブディレクトリー内にあり、プロジェクトを開発するには 3 つとも必要になります。また、OpenSSL ライブラリーを初期化するのに必要なコードは 3 行だけです。以上のすべてをリスト 1 に記載します。このチュートリアルで取り上げない機能については、リストに記載されている以外のヘッダーや初期化関数が必要になる場合があります。

リスト 1. 必要なヘッダー
/* OpenSSL headers */

#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

/* Initializing OpenSSL */

SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();

非セキュアな接続のセットアップ

OpenSSL は、ファイルやソケットなどの各種の通信 (セキュア通信と非セキュア通信の両方) を処理するために、BIO という名前の抽象化ライブラリーを利用します。UU エンコードまたは Base64 エンコードの場合には、BIO をフィルターとしてセットアップすることもできます。

BIO ライブラリーは、ここで完全に説明するには少し複雑なので、必要になったときに少しずつ紹介していきます。まずは、標準のソケット接続をセットアップする方法を説明します。標準のソケット接続は、BSD ソケット・ライブラリーを使用する場合よりも少ない行数でセットアップすることができます。

セキュアな接続であるかどうかに関わらず、接続をセットアップするには、その前に、BIO オブジェクトのポインターを作成しなければなりません。BIO ポインターは、標準 C 言語でのファイル・ストリームの FILE ポインターに似ています。

リスト 2. ポインター
BIO * bio;

接続をオープンする

新規接続を作成するには、BIO_new_connect の呼び出しが必要です。リスト 3 に示すように、ホスト名とポートの両方を同じ呼び出しで指定すると、接続を作成するだけでなく、そのオープン試行も行われます。ホスト名とポートを別々の呼び出しに分けることもできます。その場合には、一方の BIO_new_connect 呼び出しで接続を作成してホスト名を設定し、もう一方の BIO_set_conn_port (または BIO_set_conn_int_port) 呼び出しでポート番号を設定します。

いずれにしても、ホスト名とポート番号の両方が BIO に指定されると、BIO が接続のオープンを試行します。これを回避する方法はありません。BIO オブジェクトを作成する際に問題が発生した場合、ポインターは NULL になります。接続が成功したことを確認するには、BIO_do_connect を呼び出す必要があります。

リスト 3. 接続を作成してオープンする
bio = BIO_new_connect("hostname:port");
if(bio == NULL)
{
    /* Handle the failure */
}

if(BIO_do_connect(bio) <= 0)
{
    /* Handle failed connection */
}

最初の行では、新規 BIO オブジェクトを作成するために、上記のフォーマットでホスト名とポートを指定します。例えば、www.ibm.com のポート 80 に接続する場合、最初の行のストリングは “www.ibm.com:80” になります。接続が成功したかどうかは、BIO_do_connect の呼び出しで確認します。エラーが発生した場合には、0 または -1 が返されます。

サーバーと通信する

BIO オブジェクトの読み取りと書き込みは、それがソケットであるかファイルであるかに関わらず、常に 2 つの関数、BIO_readBIO_write を使用して行います。単純だと思いませんか?しかも嬉しいことに、この方法は変わることがありません。

BIO_read は、サーバーから特定のバイト数を読み取るための関数です。この関数は、読み取ったバイト数を返すか、読み取りに失敗した場合には 0 または -1 を返します。ブロッキング接続の場合、0 の戻り値は接続がクローズされていたことを意味し、-1 の戻り値はエラーが発生したことを意味します。非ブロッキング接続の場合には、0 は有効なデータがなかったこと、-1 はエラーが発生したことを意味します。回復可能なエラーであるかどうかを判別するには、BIO_should_retry を呼び出します。

リスト 4. 接続から読み取る
int x = BIO_read(bio, buf, len);
if(x == 0)
{
    /* Handle closed connection */
}
else if(x < 0)
{
   if(! BIO_should_retry(bio))
    {
        /* Handle failed read here */
    }

    /* Do something to handle the retry */
}

BIO_write は、ソケットにバイトを書き込むための関数です。この関数は、実際に書き込んだバイト数を返すか、書き込みに失敗した場合には 0 または -1 を返します。BIO_read での場合のように、0 または -1 は必ずしもエラーを意味しません。それを知る手段は、BIO_should_retry です。書き込み操作を再試行する場合は、前とまったく同じパラメーターを使用する必要があります。

リスト 5. 接続に書き込む
if(BIO_write(bio, buf, len) <= 0)
{
    if(! BIO_should_retry(bio))
    {
        /* Handle failed write here */
    }

    /* Do something to handle the retry */
}

接続をクローズする

接続をクローズするのも単純な操作です。接続をクローズするには、BIO_reset または BIO_free_all のいずれかを使用することができます。オブジェクトを再利用したい場合は前者を使用し、再利用しない場合は後者を使用します。

BIO_reset は接続をクローズして、接続を再利用できるように BIO オブジェクトの内部状態をリセットします。例えばセキュアなチャット・クライアントでのように、アプリケーション全体で同じオブジェクトを使用する場合には、この関数が役立ちます。この関数は値を返しません。

BIO_free_all は文字どおり、内部構造を解放するとともに、関連付けられているすべてのメモリーを解放します。この処理には、関連付けられたソケットのクローズも含まれます。BIO がクラスに組み込まれている場合には、そのクラスのデストラクター内でこの関数を使用します。

リスト 6. 接続をクローズする
/* To reuse the connection, use this line */

BIO_reset(bio);

/* To free it from memory, use this line */

BIO_free_all(bio);

セキュアな接続のセットアップ

今度は、セキュアな接続をセットアップするために必要な変更を適用します。変更する部分は、接続をセットアップして接続を行うところだけで、それ以外はまったく変わりません。

セキュアな接続には、接続が確立された後にハンドシェークが必要になります。ハンドシェークでは、サーバーがクライアントに証明書を送信します。すると、クライアントがその証明書を一連の信頼できる証明書に照合して検証を行います。クライアントは、証明書をチェックして、その証明書が失効していないことも確認します。証明書が信頼できるものであることを検証するには、接続を確立する前に、信頼できる証明書ストアをロードする必要があります。

クライアントがサーバーに証明書を送信するのは、サーバーが要求した場合のみです。これは、クライアント認証として知られています。セキュアな接続をセットアップするために、証明書という手段で、クライアントとサーバーの間で暗号パラメーターが受け渡されます。接続が確立された後でハンドシェークが行われたとしても、クライアントまたはサーバーは随時、新しいハンドシェークを要求することができます。

セキュアな接続をセットアップする際のハンドシェークやその他の側面については、「参考文献」セクションにリンクが記載されている RFC 2246 およびその他の記事で詳しく説明されています。

セキュアな接続をセットアップする

セキュアな接続をセットアップするには、いくつかのコード行を追加しなければなりません。まず、セキュアな接続には SSL_CTX 型のポインターが必要になります。SSL_CTX は SSL 情報を保持する (SSL コンテキストの) 構造体です。SSL_CTX ポインターは、BIO ライブラリーを使用して SSL 接続をセットアップする場合にも使用されます。この構造体を作成するには、SSL メソッド関数 (一般には SSLv23_client_method) を引数に指定して SSL_CTX_new を呼び出します。

さらに SSL 型のポインターも必要になります (この後まもなく行う処理に必要です)。この SSL は SSL 接続の情報を保持する構造体です。この SSL ポインターは、後で接続情報を検査するとき、または追加の SSL パラメーターをセットアップするときにも使用することができます。

リスト 7. SSL ポインターをセットアップする
SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method());
SSL * ssl;

信頼できる証明書ストアをロードする

SSL コンテキストの構造体を作成した後は、信頼できる証明書ストアをロードする必要があります。相手の証明書の検証を成功させるには、信頼できる証明書ストアが不可欠です。証明書が信頼できるものであることが検証できない場合、OpenSSL はその証明書に無効のフラグを立てます (ただし、接続はそのまま維持できます)。

OpenSSL には、一連の信頼できる証明書が付属しています。これらの証明書は、ソース・ツリーの certs ディレクトリーにあります。ただし、各証明書は個別のファイルであるため、それぞれを個々にロードしなければなりません。certs の下には、失効した証明書を格納するサブフォルダーもあります。これらの証明書をロードしようとすると、エラーが発生します。

各ファイルを個々にロードすることもできますが、作業を単純にするために、最新の OpenSSL ディストリビューションに付属の信頼できる証明書は、ソース・コード・アーカイブに含まれる「TrustStore.pem」という 1 つのファイルにまとめられています。特定のプロジェクトに使用するトラスト・ストア・ファイルを用意してある場合には、リスト 8 の「TrustStore.pem」を単純にそのファイルに置き換えてください (または、別個の関数呼び出しで両方ともロードするのでも構いません)。

トラスト・ストア・ファイルをロードするには、SSL_CTX_load_verify_locations を呼び出します。この関数が取る 3 つの引数は、コンテキスト・ポインター、トラスト・ストア・ファイルのパスを含むファイル名、証明書のディレクトリーへのパスです。トラスト・ストア・ファイルか、証明書のディレクトリーのいずれか一方を指定してください。この関数の呼び出しが成功すると 1 が返され、問題が発生した場合には 0 が返されます。

リスト 8. トラスト・ストアをロードする
if(! SSL_CTX_load_verify_locations(ctx, "/path/to/TrustStore.pem", NULL))
{
    /* Handle failed load here */
}

トラスト・ストアを保管するためにディレクトリーを使用する場合、ファイル名が特定の命名規則に従っていなければなりません。これについては OpenSSL のマニュアルに詳しい説明がありますが、OpenSSL に付属の c_rehash というツールを使えば、SSL_CTX_load_verify_locations に引数としてパスを渡して使用するための証明書フォルダーを用意することができます。

リスト 9. 証明書フォルダーを用意し、そのフォルダーを使用する
/* Use this at the command line */

c_rehash /path/to/certfolder

/* Then call this from within the application */

if(! SSL_CTX_load_verify_locations(ctx, NULL, "/path/to/certfolder"))
{
    /* Handle error here */
}

必要となる可能性のある検証済み証明書のすべてを指定するために、個々のファイルまたはフォルダーの名前を必要なだけ挙げることができます。また、ファイルとフォルダーを同時に指定することもできます。

接続を作成する

BIO オブジェクトは、BIO_new_ssl_connect を使用して作成します。この関数が取る唯一の引数は、SSL コンテキストの構造体 (SSL_CTX) へのポインターです。BIO オブジェクトを作成するには、SSL 接続情報の構造体 (SSL) へのポインターを取得する必要もあります。この記事ではこのポインターを、SSL_set_mode 関数でのみ使用します。この関数を使用して、SSL_MODE_AUTO_RETRY フラグをセットします。このオプションが設定されていると、突然サーバーが新しいハンドシェークを要求したときに、OpenSSL はそのハンドシェークをバックグラウンドで処理します。このオプションが設定されていなければ、サーバーが新しいハンドシェークを要求した場合、読み取り操作や書き込み操作は、そのプロセスの中で再試行フラグをセットしてエラーを返します。

リスト 10. BIO オブジェクトをセットアップする
bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, & ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

SSL コンテキストの構造体がセットアップされたので、これで、接続を作成することができます。ホスト名を設定するには、BIO_set_conn_hostname 関数を使用します。ホスト名とポートは、前述したのと同じフォーマットで指定します。この関数は、ホストへの接続もオープンします。ここでも BIO_do_connect を呼び出して、接続が正常にオープンされたことを確認する必要があります。この呼び出しを行うと、セキュアな通信をセットアップするためのハンドシェークも行われます。

リスト 11. セキュアな接続をオープンする
/* Attempt to connect */

BIO_set_conn_hostname(bio, "hostname:port");

/* Verify the connection opened and perform the handshake */

if(BIO_do_connect(bio) <= 0)
{
    /* Handle failed connection */
}

接続が確立されたら、証明書をチェックして、それが有効であることを確認しなければなりません。実際、この作業は OpenSSL が引き受けてくれます。証明書に致命的な問題がある場合には (例えば、ハッシュ値が有効でない場合)、接続が行われないだけです。ただし、証明書の問題が致命的でなければ (例えば、証明書が失効しているか、まだ有効になっていない場合)、接続を引き続き使用することができます。

OpenSSL で証明書に問題がないことが確認されたかどうかを調べるには、SSL 構造体を唯一の引数として指定して SSL_get_verify_result を呼び出してください。証明書が OpenSSL の内部チェック (信頼できるかどうかのチェックを含む) に合格すると、X509_V_OK が返されます。何らかの問題があった場合には、エラー・コードが返されます。エラー・コードについての説明は、コマンドライン・ツールの verify オプションに記載されています。

注意すべき点として、検証の失敗は、接続を使用できないことを意味するのではありません。接続を使用するかどうかは、検証結果およびセキュリティーを考慮して決めてください。例えば、信頼できる証明書に対する検証の失敗が、信頼できる証明書が単に使用できないことを意味するだけに過ぎない場合もあります。この場合、接続を使用できないというわけではなく、セキュリティーについて特別な注意を払って使用すればよいだけのことです。

リスト 12. 証明書が有効であるかどうかを確認する
if(SSL_get_verify_result(ssl) != X509_V_OK)
{
    /* Handle the failed verification */
}

必要なことは、以上ですべてです。サーバーとの通信は、いつものとおり、BIO_read および BIO_write を使用して行います。接続をクローズするには、BIO を再利用するかどうかに応じて BIO_free_all または BIO_reset を呼び出すだけです。

アプリケーションを終了する前に、ある時点で、SSL コンテキストの構造体を解放する必要があります。構造体を解放するには、SSL_CTX_free を呼び出してください。

リスト 13. SSL コンテキストをクリーンアップする
SSL_CTX_free(ctx);

エラーの検出

OpenSSL がなんらかのエラーをスローした場合、その意味を理解するには、まず初めにエラー・コードを取得する必要があります。それには、ERR_get_error を使用します。次に、そのエラー・コードをエラー・ストリングに変換します。エラー・ストリングとは、SSL_load_error_strings または ERR_load_BIO_strings によって永続的にメモリーにロードされるストリングへのポインターです。この一連の処理は、ネストされた呼び出しで実行することができます。

表 1 に、エラー・スタックからエラーを取得する方法を概説します。リスト 14 には、最新のエラー・メッセージのテキスト・ストリングを出力する方法を記載します。

表 1. スタックからのエラーの取得
ERR_reason_error_string静的ストリングへのポインターを返します。この静的ストリングは、画面に表示したり、ファイルに書き込んだりするなど、任意の方法で処理することができます。
ERR_lib_error_stringエラーが発生したライブラリーを通知します。
ERR_func_error_stringエラーの原因となった OpenSSL 関数を返します。
リスト 14. 最後のエラーを出力する
printf("Error: %s\n", ERR_reason_error_string(ERR_get_error()));

ライブラリーにフォーマット設定済みのエラー・ストリングを返させることもできます。それには、ERR_error_string を呼び出します。この関数は引数として、エラー・コードと事前に割り当てられたバッファーを取ります。バッファーの長さは、256 バイトでなければなりません。このパラメーターが NULL の場合、OpenSSL はストリングを静的バッファー (256 バイト長) に書き込み、そのバッファーへのポインターを返します。それ以外の場合は、指定されたポインターを返します。静的バッファーのオプションを選んだ場合、そのバッファーは、次に ERR_error_string が呼び出されると上書きされます。

リスト 15. フォーマット設定済みエラー・ストリングを取得する
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));

エラー・キュー全体をファイルまたは BIO のいずれかにダンプ出力することも可能です。その場合には、ERR_print_errors または ERR_print_errors_fp を使用します。キューは、読んで理解できるフォーマットでダンプされます。前者の関数はキューを BIO に送信し、後者は FILE に送信します。ストリングのフォーマットは (OpenSSL のマニュアルによると)、以下のとおりです。

[pid]:error:[エラー・コード]:[ライブラリー名]:[関数名]:[理由を示すストリング]:[ファイル名]:[行]:[オプションのテキスト・メッセージ]

ここで、[pid] はプロセス ID、[エラー・コード] は 8 桁の 16 進コード、[ファイル名] は OpenSSL ライブラリーに含まれるソース・コード・ファイルの名前、[行] はそのソース・ファイル内の行番号です。

リスト 16. エラー・キューをダンプ出力する
ERR_print_errors_fp(FILE *);
ERR_print_errors(BIO *);

使い始めてください

OpenSSL で基本的な接続を作成するのは難しいことではありませんが、OpenSSL のマニュアルでその方法を調べるとなると、それは少し手ごわい作業になる可能性があります。この記事では基礎を紹介しただけです。OpenSSL には、未知の極めて優れた柔軟性、そしてプロジェクトに SSL 機能を的確に実装するために必要な詳細設定があります。

この記事には、2 つのサンプルが用意されています。一方のサンプルでは、http://www.verisign.com/ への非セキュアな接続、もう一方では https://www.verisign.com/ へのセキュアな SSL 接続を例示しています。いずれのサンプルも、サーバーに接続してホーム・ページをダウンロードします。これらのサンプルでは、セキュリティー・チェックは行われません。また、ライブラリー内のすべての設定はデフォルトです。したがって、この記事での学習の一環としてのみ使用してください。

ソース・コードは、サポートされているシステムであれば、どのシステムでも簡単にコンパイルできるはずですが、OpenSSL の最新バージョンを使用することをお勧めします。この (原文の) 記事を執筆している時点での最新バージョンは 0.9.7d です。


ダウンロード

内容ファイル名サイズ
Source code for this articleintro-openssl.zip9KB

参考文献

学ぶために

製品や技術を入手するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=848032
ArticleTitle=OpenSSL API によるセキュア・プログラミング: 第 1 回 API の概要
publish-date=12062012