ssl_prefer_server_ciphersを有効にしたらERR_SPDY_INADEQUATE_TRANSPORT_SECURITYが出るようになった。

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

chrome

$ 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)                                                   


firefox

$ 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)