追記20180922
OpenSSLも対応しました
「support for TLSv1.3 early data with OpenSSL.」
http://hg.nginx.org/nginx/rev/548a63b354a2
昨日、NginxがTLS1.3の0-RTTハンドシェイクをサポートしたので試した。無事動作することが確認できた。
該当コミットはこの2つ
TLS1.3の0-RTTハンドシェイクは、一度ハンドシェイクをした相手とはClientHelloに続けてアプリケーションデータ(HTTPリクエスト)を送信することで、より早くデータのやりとりを開始する方法です。
(引用: https://blog.cloudflare.com/tls-1-3-overview-and-q-and-a/)
通常のResumptionよりも1-RTT分早くHTTPリクエストを送信されることになります。しかし、このデータは再送攻撃が可能ですので、冪等なリクエスト以外はearly_dataを拒否すべきです。詳しくは以前書いた記事を参照
asnokaze.hatenablog.com
BoringSSL
コミットログに書かれている通り、BoringSSLを使用する必要があります。
基本的には公式のビルド手順のとおりです
(ninjaの公式ページからninjaをダウンロードしておく)
git clone https://github.com/google/boringssl.git cd ./boringssl mkdir build cd build cmake -GNinja .. ninja
nginxのビルド準備
#./boringsslのディレクトリ mkdir -p .openssl/lib cd .openssl ln -s ../include . cd ../ cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
nginxのビルド
wget http://hg.nginx.org/nginx/archive/tip.tar.gz tar zxvf ./tip.tar.gz cd ./nginx-ba971deb4b44 #解凍したディレクトリ ./auto/configure --with-openssl=/PATHTO/boringssl/ --with-http_ssl_module make
config
nginx.conf内で、ssl_early_data on と指定することで0-RTT early_dataが有効になります
server { listen 443 ssl ; server_name localhost; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_early_data on; ...
アクセスしてみる
nginxを起動する
sudo ./nginx-ba971deb4b44/objs/nginx
せっかくなので boringssl のtoolを使う
cat ./boringssl/build/request.txt //early_dataをtxtに書いておく GET / HTTP/1.1 host:localhsot ./boringssl/build/tool/bssl client -tls13-variant draft28 -connect 127.0.0.1:443 -test-resumption -early-data @./request.txt Connecting to 127.0.0.1:443 Connected. Version: TLSv1.3 Resumed session: yes (略) Early data: yes #★ Early data: yesとなる HTTP/1.1 200 OK Date: Tue, 07 Aug 2018 16:25:00 GMT Content-Type: text/html (略)
nginx ログ
nginxのログでも、$ssl_early_data でearly_dataがあったか確認できる
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '$ssl_protocol $request_time early=$ssl_early_data';
こんな感じのログが出る
127.0.0.1 - - [07/Aug/2018:16:19:15 +0000] "GET / HTTP/1.1" 200 612 "-" TLSv1.3 0.000 early=1