ichou1のブログ

主に音声認識、時々、データ分析のことを書く

OpenSSL APIメモ(HTTP/2対応その1)

OpenSSL APIを使うクライアントプログラムで「SSL_ERROR_SYSCALL」が返ってきた。

エラーを返している部分はSSL_connect()

通信内容を確認してみると、アクセスしようとしているサイトはHTTP/2対応だった。
(WEBサーバはNginx)

段階的に修正してみる。

HTTP/2ではTLS1.2以降を使う必要があるようなので、

SSL_CTX_new(TLSv1_client_method());

を以下のように変更する。

SSL_CTX_new(TLSv1_2_client_method());

SSL_connect()は通ったがレスポンスは以下のとおり。

Status  :505
Method  :HTTP/1.1

HTTP2でネゴシエーションするためにはどうするか。
ALPNと呼ばれるTLS拡張を使う模様。

qiita.com


1.0.2から対応のようなので、公式サイトから「1.0.2p」を落としてコンパイル

% openssl version
OpenSSL 1.0.2p  14 Aug 2018

以下のサイトの「libevent-client.c」を参考にコードを追加する。
Tutorial: HTTP/2 client — nghttp2 1.33.0-DEV documentation

SSL_CTX_set_alpn_protos(ctx, (const unsigned char *)"\x02h2", 3);
SSL_set_alpn_protos(ssl, (const unsigned char *)"\x02h2", 3); 

これでリクエストを送信する準備が整った。

続いて、SSL_write()でサーバへ渡している内容を置き換える(frameと呼ばれるバイナリ形式のフォーマットを使う)
http2 最速実装 v2

今回はここまで。