ubuntu14.04で、Nginx1.9.3 + patch.http2-v2 + openssl1.0.2d
環境構築は「nginx1.9.3 HTTP/2 パッチを試す」
server { listen 443 ssl http2 ; ssl_prefer_server_ciphers on; #★offにすると繋がる server_name localhost; ssl_certificate xxx.crt; ssl_certificate_key xxx.key; location / { root /usr/share/www; } }
(nginxのssl_ciphersのデフォルトは"HIGH:!aNULL:!MD5;")
ssl_prefer_server_ciphersを有効にし、ブラウザ(Chrome,Firefox)でアクセスするとServerHelloでTLS_ECDHE_RSA_WITH_AES_256_CBC_SHAが帰ってくるようになり、ChromeだとERR_SPDY_INADEQUATE_TRANSPORT_SECURITYが出てアクセスできなくなってしまった。
結論
ssl_prefer_server_ciphersを有効にすると、ClientHelloのCipher listで先にあるこれら2つよりも
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
以下が選択されるようになってしまう。
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
そのため、CBCモードなのでGCMが必要なHTTP2の通信ではERR_SPDY_INADEQUATE_TRANSPORT_SECURITYになってしまう。
仕様的にはINADEQUATE_SECURITYエラーと呼ばれるものです。
エンドポイントは、これらの TLS 要件が満たされない HTTP/2 コネクションを、INADEQUATE_SECURITY のコネクションエラー (5.4.1節) と共に直ちに終了してもよいものとします (MAY)。
対策
server { listen 443 ssl http2 ; ssl_prefer_server_ciphers on; ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
ssl_ciphersでAESGCMをHIGHより優先度を上げる
以下は、調べた時の細かい情報
ブラウザのCipher Suites
ClientHelloで提出されるCipher Suites
$ sudo tshark -V Cipher Suites (17 suites) Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc14) Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc13) Cipher Suite: TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc15) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) Cipher Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x009e) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014) Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013) Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033) Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c) Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035) Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f) Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a) Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
$ sudo tshark -V Cipher Suites (11 suites) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014) Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033) Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039) Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f) Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035) Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
ssl_prefer_server_ciphers offの時
上記ブラウザでアクセスすると、ServerHelloで選択されるCipher Suiteは
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256が選択される
$ sudo tshark -V Handshake Protocol: Server Hello Handshake Type: Server Hello (2) Length: 66 Version: TLS 1.2 (0x0303) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
ssl_prefer_server_ciphers onの時
上記ブラウザでアクセスすると、ServerHelloで選択されるCipher Suiteは
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHAが選択される
$ sudo tshark -V Handshake Protocol: Server Hello Handshake Type: Server Hello (2) Length: 86 Version: TLS 1.2 (0x0303) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
openssl s_clientで幾つかchiper suitesを試す
client versionも1.0.2d
y@ubuntu:~$ openssl version OpenSSL 1.0.2d 9 Jul 2015
chiper suites指定しない(全部)だと、ECDHE-RSA-AES256-GCM-SHA384
y@ubuntu:~$ openssl s_client -connect asnokaze.com:443 |grep SSL-Session -A2 SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384
ココで、"ECDHE-RSA-AES128-GCM-SHA25:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA"を送ると
ECDHE-RSA-AES256-SHA(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA)が選択された。
y@ubuntu:~$ openssl s_client -connect asnokaze.com:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA25:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA' |grep -A2 SSL-Session SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-SHA
この順番通りに優先するということかな...
y@ubuntu:~$ openssl ciphers "HIGH" -v |grep -e ECDHE-RSA-AES128-GCM-SHA25 -eECDHE-ECDSA-AES128-GCM-SHA256 -e ECDHE-RSA-AES256-SHA ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
よりも以下が優先されると...
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)