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)