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

C言語にて ソケット関数を使って HTTP クライアントを作成する
の続きです。

openssl

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

OpenSSL https://www.openssl.org/

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

HTTPS クライアント

HTTPSクライアントとは、ウェブサーバ( HTTPS サーバ)に対して、HTTPSプロトコルに則り、 データの送受信を行うプログラムのこと。

この記事で作成するのは、簡単なリクエストを送信し、受信したレスポンスを文字列として表示する簡素なもの。

HTTPS クライアントを作成する

下記を参考にした。
OpenSSL を使って HTTPS クライアントをつくる
https://blog.sarabande.jp/post/82068392478

IPアドレスとポート番号を指定して、 サーバーに接続するところは、 前回の HTTPクライアント と同じです。

サーバーに接続すると、SSLハンドシェイクを行い、データを送受信する。

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

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

SSL_CTX *ctx = NULL;
ctx = SSL_CTX_new( SSLv23_client_method() );

SSL *ssl = NULL;
ssl = SSL_new(ctx);

// ソケットを生成する
int  sockfd  = socket( AF_INET, SOCK_STREAM, 0 );

// サーバーに接続する
connect( sockfd, ... );

// ソケットをSSLに設定する
SSL_set_fd( ssl, sockfd );

// SSLサーバーとSSLハンドシェイクを開始する
SSL_connect(ssl);

// リクエストを送信する
SSL_write(ssl, request, strlen(request) );

// レスポンスを受信する
SSL_read(ssl, read_buf );

// レスポンスを表示する
printf("%s \n", read_buf);

例として、サーバーに example.com を指定して実行すると、 下記のようなレスポンスを表示する

HTTP/1.1 200 OK  
Content-Type: text/html; charset=UTF-8  
<html>  
<head>  
<title>Example Domain</title>

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