はじめに
「SSL_newは何をする関数なの?」
「SSL_CTXを作成したあと、SSL_newをどのタイミングで使えばいいの?」と迷っていませんか。
OpenSSLを使ってSSL/TLS通信を実装しようとしても、SSL_CTXやSSLといった似た名前が出てくると、それぞれの役割や処理の順番が分からず迷ってしまいますよね。
この記事では、SSL_newの基本的な役割からSSL_CTXとの関係、実際の使い方や処理の流れまで順を追って説明していきます。
SSL_newとは?

SSL_newは、SSL/TLS通信で使用するSSLオブジェクトを作成するための関数です。
ここでは、SSL_newの基本的な役割からSSL_CTXとの関係、関数を使用するときの構文と引数まで順に説明します。
SSL_newはSSLオブジェクトを作成する関数
SSL_newは、OpenSSLでSSL/TLS通信に使用するSSLオブジェクトを作成する関数です。
引数にSSL_CTXオブジェクトを渡して呼び出すと、新しいSSLオブジェクトが作成され、接続ごとのSSL/TLS通信を管理できる状態になります。
SSL_CTXの設定を引き継いでSSLオブジェクトを作成する
SSL_newで作成されるSSLオブジェクトは、引数に指定したSSL_CTXの設定を引き継ぎます。
SSL_CTXに設定した証明書や秘密鍵、暗号方式などがSSLオブジェクトへ反映されるため、同じ設定を接続ごとに設定し直す必要はありません。
SSL_newの構文と引数
SSL_newの構文は「SSL *SSL_new(SSL_CTX *ctx);」です。
引数のctxには作成済みのSSL_CTXオブジェクトへのポインタを指定し、SSL_newを呼び出してSSLオブジェクトを作成します。
SSL_newの戻り値とエラーの確認方法
SSL_newを実行したあとは、戻り値からSSLオブジェクトが正常に作成されたかを確認します。
ここでは、成功した場合に返される値と、失敗してNULLが返された場合のエラー確認方法を説明します。
成功するとSSLオブジェクトへのポインタが返される
SSL_newの呼び出しに成功すると、新しく作成されたSSLオブジェクトへのポインタが返されます。
戻り値がNULLでなければSSLオブジェクトの作成に成功しているため、返されたポインタをSSL型の変数に保持します。
失敗してNULLが返された場合はエラー内容を確認する
SSL_newの呼び出しに失敗すると、戻り値としてNULLが返されます。
戻り値がNULLかどうかを判定し、NULLの場合はOpenSSLのエラーキューからエラー内容を取得して、SSLオブジェクトを作成できなかった原因を確認します。
NULLが返されたあと、OpenSSLのエラーキューから具体的な原因を確認する方法が分からない場合は、エラーの取得方法もあわせて確認しておきましょう。
▶OpenSSLのエラーを確認する方法は?ERR_get_errorの使い方を解説
SSL_newの基本的な使い方
SSL_newを使用するときは、先にSSL_CTXを作成して必要な設定を行ってからSSLオブジェクトを生成します。
ここでは、SSL_newを呼び出す基本的な流れをサンプルコードで確認し、作成したSSLオブジェクトをSSL_freeで解放する方法まで説明します。
SSL_CTXを作成してからSSL_newを呼び出す
SSL_newを呼び出す前に、SSL_CTX_newでSSL_CTXオブジェクトを作成します。
作成したSSL_CTXへのポインタをSSL_newの引数に渡すことで、そのSSL_CTXを基にSSLオブジェクトが作成されます。
SSL_CTXの作成方法や、証明書・秘密鍵をどのタイミングで設定するのか迷う場合は、SSL_CTXの基本的な使い方を確認しておくと流れを整理しやすくなります。
▶SSL_CTXとは?基本的な使い方とSSL/TLS通信の設定方法を解説
SSL_newを使った最小限のサンプルコード
SSL_CTX_newでSSL_CTXを作成し、そのポインタをSSL_newへ渡します。
SSL_newの戻り値をSSL型のポインタで受け取り、NULLでなければSSLオブジェクトの作成は成功です。
SSL_CTX *ctx = SSL_CTX_new(TLS_method());
SSL *ssl = SSL_new(ctx);
if (ssl == NULL) {
/* SSL_newのエラー処理 */
}
作成したSSLオブジェクトはSSL_freeで解放する
SSL_newで作成したSSLオブジェクトが不要になったら、SSL_freeにSSLオブジェクトへのポインタを渡して解放します。
SSL_newを1回呼び出して作成したSSLオブジェクトごとにSSL_freeを呼び出し、確保されたリソースを解放します。
まとめ
SSL_newは、作成済みのSSL_CTXを基にSSLオブジェクトを作成する関数です。
呼び出しに成功するとSSLオブジェクトへのポインタが返され、失敗するとNULLが返されるため、エラー内容を確認します。
作成したSSLオブジェクトは、不要になった時点でSSL_freeを使って忘れずに解放しましょう。











