C言語にて opensslライブラリを使って 証明書チェーンを備えたHTTPS サーバを作成する

C言語にて ソケット関数と openssl ライブラリを使って HTTPSサーバを作成する
の続きです

証明書チェーン

証明書チェーンとは、サーバの認証に使用される証明書のリストです。 このチェーンは、サーバ証明書から始まり、 サーバ証明書を署名した中間局の証明書と続き、 中間局を署名したルート CA証明書で終了します。

参考 IBM 証明書チェーンの働き
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.sec.doc/q009880_.htm

証明書チェーンに必要な証明書の作成は、 下記を参照ください。

openssl コマンドを使って オレオレ認証局を作成してサーバ証明書を発行する
https://ken-ohwada.hatenadiary.org/entry/2021/02/27/122111

証明書チェーンを備えた HTTPS サーバを作成する

証明書チェーンを構成するには、 SSL_CTX_add_extra_chain_cert 関数を使用する

SSL_CTX_add_extra_chain_cert
https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_add_extra_chain_cert.html

下記のようなコードになる。

// 中間局が署名したサーバ証明書を設定する
SSL_CTX_use_certificate_file( ctx, file_server_cert, SSL_FILETYPE_PEM );

// サーバ証明書の秘密鍵を設定する
SSL_CTX_use_PrivateKey_file (ctx, file_server_key, SSL_FILETYPE_PEM );

/// 中間局の証明書を設定する
X509* x509_1 = read_x509_from_pem( file_inter_cert );
SSL_CTX_add_extra_chain_cert( ctx, x509_1 );

// ルート認証局の証明書を設定する
X509* x509_2 = read_x509_from_pem( file_root_cert );
SSL_CTX_add_extra_chain_cert( ctx, x509_2 );


// PEM形式のファイルから X509証明書を読み込む
X509* read_x509_from_pem(char *file)
{

BIO  *certbio = NULL;
X509   *x509= NULL;

certbio = BIO_new( BIO_s_file() );
BIO_read_filename( certbio, file );
x509 = PEM_read_bio_X509( certbio, NULL, 0, NULL );

return x509;
}

証明書チェーンを確認する

上記のコードを実行する。
openssl s_client コマンドで確認すると、下記のように表示される

% openssl s_client -connect localhost:8083 -showcerts

depth=2 CN = hoge CA
verify return:1
depth=1 CN hoge inter CA
verify return:1
depth=0 CN = localhost
verify return:1

ウェブブラウザで表示する

下記を参照ください。
ウェブブラウザでオレオレ認証局で作成したサーバ証明書のサイトを閲覧する
https://ken-ohwada.hatenadiary.org/entry/2021/02/28/112511

うまくいくと下記のように表示される。

f:id:ken_ohwada:20210228113710p:plain
chrome add extra chain

Github にコードを公開した。 https://github.com/ohwada/MAC_cpp_Samples/tree/master/openssl/https