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拡張を使う模様。
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
今回はここまで。