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

C言語にて ソケット関数を使って ウエブサーバを作成する
の続きです

openssl

OpenSSLは、SSLプロトコルのソフトウェアである。
C言語のライブラリも備えている。

OpenSSL
https://www.openssl.org/

下記を参照ください。
MAC に openssl をインストールして開発環境を作る
https://ken-ohwada.hatenadiary.org/entry/2021/02/21/151304

HTTPSサーバ

HTTPS(Hypertext Transfer Protocol Secure)は、HTTPによる通信をより安全に(セキュアに)行うためのプロトコルである。

HTTPSサーバは、 HTTPSに対応したウエブサーバである。
HTTPS接続のためのサーバー証明書が必要となる。

今回作るHTTPSサーバは、リクエストを解析せず、何が来ても同じ HTML を返送する簡素なもの。

今回作るHTTPSサーバでは、オレオレ証明書を使用する。

下記を参照のこと。
openssl コマンドを使って オレオレ証明書を作成する
https://ken-ohwada.hatenadiary.org/entry/2021/02/21/151612

HTTPSサーバを作成する

下記を参考にした。
OpenSSL を使って HTTPS サーバーをつくる
https://blog.sarabande.jp/post/82087204080

ポート番号を指定して待ち受けする。

クライアントが接続すると、SSLハンドシェイクを行い、データを受信する。

レスポンス (HTML) を送信する。

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

// 初期化
SSL_load_error_strings();   
OpenSSL_add_ssl_algorithms();

 SSL_CTX *ctx;
ctx = SSL_CTX_new( SSLv23_server_method() );

SSL *ssl;
ssl = SSL_new(ctx);

// サーバ証明書を読み込む
SSL_CTX_use_certificate_file( ctx, file_cert, SSL_FILETYPE_PEM );

// 秘密鍵を読み込む
SSL_CTX_use_PrivateKey_file( ctx, file_key, SSL_FILETYPE_PEM );

// 待ち受けする
listen();

// 接続してきたクライアントのソケットディスクリプタを取得する
int sockfd_client = accept();

// ディスクリプタをSSLに設定する
SSL_set_fd(ssl, sockfd_client);

// クライアントがSSLハンドシェイクを開始するのを待つ
SSL_accept(ssl);

// リクエストを受信する
SSL_read(ssl, buf );

// レスポンスを送信する
SSL_write(ssl, data, strlen(data) );

ウェブブラウザで確認する

下記を参照のこと。
ウェブブラウザでオレオレ証明書のサイトを閲覧する
https://ken-ohwada.hatenadiary.org/entry/2021/02/22/155246

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

f:id:ken_ohwada:20210222160707p:plain
https server

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