Hatena::ブログ(Diary)

あすのかぜ Twitter

2017-01-20

NginxでTLS1.3 動いた(OpenSSL)

昨日書いた「OpenSSLのTLS1.3対応」の続き


特に何かしたわけではないが、OpenSSLのTLS1.3対応が進んでいたのでインストールしてNginxで動かす。

ビルド

openssl

今回はインストールしてしまう。

$ git clone https://github.com/openssl/openssl.git
$ cd ./openssl
$ git log --oneline |head -n1
ef3f621 Fix man3 reference to CRYPTO_secure_used

$ ./config enable-tls1_3
$ make
$ sudo make install

nginx (openssl1.1.0対応が終わってるものなら大丈夫かと)

$ git clone https://github.com/nginx/nginx.git
$ cd ./nginx
$ ./auto/configure --with-http_ssl_module
$ make
$ make install

(conf修正と、証明書は各自)


試す

Firefox Nightlyで、about:configよりsecurity.tls.version.maxを5に設定しておく。

アクセスし、デベロッパーツールのセキュリティパネルより確認する。

f:id:ASnoKaze:20170120000959p:image

この通りTLS1.3と表示される


Nginx側のログも、この通りTLS1.3であることが確認できる

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      'TLS:$ssl_protocol';
192.168.0.105 - - [19/Jan/2017:15:11:54 +0000] "GET / HTTP/1.1" 200 0 "-" TLS:TLSv1.3

実装としてはやはりまだ不安定でChrome Canaryだと通信に失敗する

ちなみに、ALPNも動いてるようでhttp2も普通に喋れている。


ベンチでも取りたかったが、abがopenssl 1.1.0でのインターフェイス変更に対応してるかちょっと怪しかったので断念。


ゆくゆくは何も意識せずTLS1.3が使われるようになるだろう。

2017-01-18

PerformancePaintTiming APIとは

昨今、「Navigation Timing API」といったクライアント側でのページの処理時間を取得する機能が充実してきております。


W3CのWeb Performance WGでは、Navigation Timing、User Timing、Resource TimingそれぞれLevel2, Level3が改訂作業が行われております。(ドラフト状況)


また、昨年末頃より「PerformancePaintTiming」APIの議論が行われているように感じます。簡単な仕様はgithubのwicg organization以下に公開されております ( https://github.com/WICG/paint-timing )。これは、より多くの情報を取得できるようにする一環で、実際の描画時間が重要度が高いためのようだ。


数年前に、ふろしきさんが「Webページ遷移時間のパフォーマンス「First Paint」を計測する方法」で書かれている通り、window.chrome.loadTimes()より、firstPaintがとれましたが、より現代的な標準APIが検討されております。



PerformancePaintTiming

リポジトリの使い方とサンプルを見るのがわかりやすいかと思います。

PerformanceObserverから、firstPaintエントリより最初の描画タイミングが取得できます。

var observer = new PerformanceObserver(function(list) {
  var perfEntries = list.getEntries();
  for (var i = 0; i < perfEntries.length; i++) {
     // Process entries
     // report back for analytics and monitoring
     // ...
  }
});

// register observer for long task notifications
observer.observe({entryTypes: ["firstPaint"]});

f:id:ASnoKaze:20170118233402p:image

(https://github.com/WICG/paint-timing#examples

  • first-paint: ナビゲーション後のcontaining blockを最初に描画した時間(背景を除く)
  • first-contentful-paint: 最初の、テキスト、画像、キャンバス、SVGを描画した時間

Improving accuracy of FP / FCP

Chromeでは、内部的にFPとFCPの時間を取得しており stable版で情報収集をしている。

https://docs.google.com/document/d/1XVP9jaZT7acQtK5O6vO-mIz31i5iB-pZn1S41_YP6p0/edit#


その中で、さらに細かくどこまでの時間をFP, FCPに含めるべきなのかというレポートを出している。どこまで仕様化できるかはわからないが、今後共WebPerf WGで議論が続けられる模様である。

OpenSSLのTLS1.3対応 喋れる

追記 20170120


NginxでTLS1.3 動いた(OpenSSL)

後日Nginxでも動いたので、上記記事に記載


セキュリティとパフォーマンスが向上したTLS1.3の登場が待ち望まれております。


標準化としては、現在IETFのTLSワーキンググループではWGラストコールという段階に入っており、2月頃にはIESGに提出され標準化は最終段階となる見込みになっております(結構そっから議論があったりはするんですが)。


すでに、実装としてはChrome, Firefoxといったブラウザもオプションで有効化に出来る他、BoringSSL, picotls, nssといった実装も出てきており、相互通信テストなども行われております。


昨年行われたIETF97時点ですが、下記のような実装で通信テストに成功しています。

f:id:ASnoKaze:20170118014714p:image

https://www.ietf.org/proceedings/97/slides/slides-97-tls-tls-13-00.pdf


さて、OpenSSLはと思うところですが、同じくIETF97時点ですが、OpenSSLの状況が報告されております。すべての作業github上でプルリクが出されており、次のリリースで出るとのことでした。

https://www.ietf.org/proceedings/97/slides/slides-97-tls-openssl-update-00.pdf


TLS1.3の中身の話は、kazuhoさんやkazuさんの資料がわかりやすいかと思います


とりあえず、現状で試してみる

OpenSSLはまだまだ開発中で動かないかもと思いながらも、試してみる

./config時にenable-tls1_3を与える

$ git clone https://github.com/openssl/openssl.git
$ cd ./openssl
$ git log --oneline |head -n1
ef3f621 Fix man3 reference to CRYPTO_secure_used

$ ./config enable-tls1_3
$ make

既存実装のリストは下記にあるので、公開URLのものから幾つか繋いで見る

https://github.com/tlswg/tls13-spec/wiki/Implementations


クライアントで試す

他のバージョンと同様 --tls1_3を与える

$ LD_LIBRARY_PATH=./ ./apps/openssl s_client -connect franziskuskiefer.de:9913 --tls1_3
...
New, TLSv1.3, Cipher is TLS13-AES-128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS13-AES-128-GCM-SHA256
    Session-ID:
    Session-ID-ctx:
    Master-Key: AC496ABF3FE5EF1C197CA5B825746CD58A05E86494288C82057604F819C2B757
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1484672332
    Timeout   : 7200 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
    Extended master secret: no
---
GET / HTTP/1.1
host:test

HTTP/1.1 200 OK
Date: Tue, 17 Jan 2017 16:58:56 GMT
Server: Apache
Upgrade: h2
Connection: Upgrade, close
Last-Modified: Fri, 03 Jun 2016 08:50:46 GMT
ETag: "d5f-5345bd194edaf"
Accept-Ranges: bytes
Content-Length: 3423
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
...

他のは繋がらなかったものの、つながるサーバもあった。

(どこが悪いのかまだちゃんと見てない...


サーバ側で試す

Chrome canaryと通信させる

$ LD_LIBRARY_PATH=./ ./apps/openssl s_server -cert ../server.crt -key ../server.key  -tls1_3
...
-----BEGIN SSL SESSION PARAMETERS-----
MGUCAQECAgMEBAITAQQgMuuXEJUnlwWHomt0g/L89WPXiudXU2AHGFd6NdSKBPYE
IIKAszcJj6hsNaEPwtZz6t/IskTrQB5QnBvCCV9YjxZ+oQYCBFh+TwiiBAICHCCk
BgQEAQAAAA==
-----END SSL SESSION PARAMETERS-----
Shared ciphers:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA
Signature Algorithms: ECDSA+SHA256:RSA+SHA256:RSA+SHA256:ECDSA+SHA384:RSA+SHA384:RSA+SHA384:RSA+SHA512:RSA+SHA512:RSA+SHA1
Shared Signature Algorithms: ECDSA+SHA256:RSA+SHA256:RSA+SHA256:ECDSA+SHA384:RSA+SHA384:RSA+SHA384:RSA+SHA512:RSA+SHA512:RSA+SHA1
Supported Elliptic Groups: 0x9A9A:X25519:P-256:P-384
Shared Elliptic groups: X25519:P-256:P-384
CIPHER is TLS13-AES-128-GCM-SHA256
Secure Renegotiation IS NOT supported
GET / HTTP/1.1
Host: 192.168.0.179:4433
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2984.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6


なんか、怪しいけど、HTTPリクエストが来てることは確認できた。

2016-12-31

2016年振り返り

早いもので2016年も終わりですね。


今年は、毎月コンスタントにブログ記事を書けたもの、記事数39と去年よりも少なくなってしまいました。internet-draft絡みも9本でした。


ただ反面、OSSにPR投げてマージされたり、英語でissue投げてみたり、Nginxのモジュール書いてみたり出来たのは良かったなと思いました。


昨年同様 IETFにも行けましたし、来年も行けるように頑張ります。

来年も、微力ながら誰かのお役に立てるように精進していければと思います。


今年もありがとうございました。