OpenSSLのTLS1.3対応 喋れる

追記 20170120


NginxでTLS1.3 動いた(OpenSSL)
後日Nginxでも動いたので、上記記事に記載


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


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


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


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

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リクエストが来てることは確認できた。