ユーザ用ツール

サイト用ツール


Sidebar

アプリケーション系:libjingle:libjingleとjavaでのtlsハンドシェイク回りの実装について

libjingleとJAVAでのTLSハンドシェイク回りの実装について

SSLContext sslc = SSLContext.getDefault();//
SSLServerSocketFactory sslssf = sslc.getServerSocketFactory();//
SSLServerSocket sslss = (SSLServerSocket)sslssf.createServerSocket(<ポート番号>);//
String[] protocols = new String[]{"SSLv3","TLSv1","TLSv1.1","TLSv1.2"};//
sslss.setEnabledProtocols(protocols);//
String[] suites = new String[]{"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384","TLS_RSA_WITH_AES_256_CBC_SHA256","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384","TLS_DHE_RSA_WITH_AES_256_CBC_SHA256","TLS_DHE_DSS_WITH_AES_256_CBC_SHA256","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_AES_256_CBC_SHA","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA","TLS_DHE_RSA_WITH_AES_256_CBC_SHA","TLS_DHE_DSS_WITH_AES_256_CBC_SHA","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256","TLS_DHE_RSA_WITH_AES_128_CBC_SHA256","TLS_DHE_DSS_WITH_AES_128_CBC_SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_128_CBC_SHA","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA","TLS_DHE_RSA_WITH_AES_128_CBC_SHA","TLS_DHE_DSS_WITH_AES_128_CBC_SHA","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA","TLS_ECDHE_RSA_WITH_RC4_128_SHA","SSL_RSA_WITH_RC4_128_SHA","TLS_ECDH_ECDSA_WITH_RC4_128_SHA","TLS_ECDH_RSA_WITH_RC4_128_SHA","TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA","SSL_RSA_WITH_3DES_EDE_CBC_SHA","TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA","TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA","SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA","SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA","SSL_RSA_WITH_RC4_128_MD5"};//
// この辺りで効率の良い(暗号の強さは落ちる)Cipherに限定する?
sslss.setEnabledCipherSuites(suites);//

クライアント側から使い体Ciphersuiteを送信する必要があるので、クライアント側のSSL実装も変更する必要がある? でも、クライアント側はかなり多くのsuiteを通常送るので、サーバ側で一番早そうなCipherを選択してやるだけでよ さそうなので、サーバ側の実装変更になると予想される。

しかし、JAVAのサーバ側のCiphersuite選択はここのような実装になっているようだ。

サーバ側でのBEAST対策として、CipherSuiteにRC4のようなストリーム暗号を使用するものを選ぶという方法があります。しかし残念なことに、TomcatのようなJavaで書かれたサーバアプリケーションでは、クライアント側から送られるCipherSuiteの一覧が先頭から順番に評価され、サーバ側で有効にしているものが見つかった時点で、そのCipherSuiteが選択されます。そのため、サーバ側がAESとRC4のどちらも有効になっており、かつクライアント側がRC4よりもAESを使いたがっている場合には、必ずAESが選択されてしまいます。

サーバ側では、SSLSocketクラスのsetEnabledCipherSuitesメソッドを使うことにより、CipherSuiteの有効・無効については制御することができます。そのため、AESのようなブロック暗号を使用するCipherSuiteをすべて無効にしてしまうという方法も技術的には可能ですが、この場合実質的にRC4のみをサポートするSSLサーバとなってしまうでしょう(現実的にはRC4をサポートしないクライアントというのはあまりいないかと思われますので、それでも問題ないと考えることもできるかもしれません)。

ということは、やはりクライアント側で限定する必要がありそうだ。

~/DEV/synciga/src/net/third_party/nss/ssl/dtlscon.c
 
  32 /* List copied from ssl3con.c:cipherSuites */
  33 static const ssl3CipherSuite nonDTLSSuites[] = {
  34 #ifdef NSS_ENABLE_ECC
  35     TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  36     TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  37 #endif  /* NSS_ENABLE_ECC */
  38     TLS_DHE_DSS_WITH_RC4_128_SHA,
  39 #ifdef NSS_ENABLE_ECC
  40     TLS_ECDH_RSA_WITH_RC4_128_SHA,
  41     TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
  42 #endif  /* NSS_ENABLE_ECC */
  43     SSL_RSA_WITH_RC4_128_MD5,
  44     SSL_RSA_WITH_RC4_128_SHA,
  45     TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,
  46     SSL_RSA_EXPORT_WITH_RC4_40_MD5,
  47     0 /* End of list marker */
  48 };
  • libjingle(nss)に実装されているcipherリスト
~/DEV/synciga/src/net/third_party/nss/ssl/ssl3con.c
 
   74 /* This list of SSL3 cipher suites is sorted in descending order of
   75  * precedence (desirability).  It only includes cipher suites we implement.
   76  * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites
   77  * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c)
   78  */
   79 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = {
   80    /*      cipher_suite                         policy      enabled is_present*/
   81 #ifdef NSS_ENABLE_ECC
   82  { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,   SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   83  { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,     SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   84 #endif /* NSS_ENABLE_ECC */
   85  { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   86  { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   87  { TLS_DHE_RSA_WITH_AES_256_CBC_SHA,     SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
   88  { TLS_DHE_DSS_WITH_AES_256_CBC_SHA,     SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
   89 #ifdef NSS_ENABLE_ECC
   90  { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,      SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   91  { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,    SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   92 #endif /* NSS_ENABLE_ECC */
   93  { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,      SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   94  { TLS_RSA_WITH_AES_256_CBC_SHA,         SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
   95
   96 #ifdef NSS_ENABLE_ECC
   97  { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,       SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   98  { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,   SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
   99  { TLS_ECDHE_RSA_WITH_RC4_128_SHA,         SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  100  { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,     SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  101 #endif /* NSS_ENABLE_ECC */
  102  { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  103  { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  104  { TLS_DHE_DSS_WITH_RC4_128_SHA,           SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  105  { TLS_DHE_RSA_WITH_AES_128_CBC_SHA,       SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
  106  { TLS_DHE_DSS_WITH_AES_128_CBC_SHA,     SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
  107 #ifdef NSS_ENABLE_ECC
  108  { TLS_ECDH_RSA_WITH_RC4_128_SHA,          SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  109  { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,      SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  110  { TLS_ECDH_ECDSA_WITH_RC4_128_SHA,        SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  111  { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,    SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  112 #endif /* NSS_ENABLE_ECC */
  113  { TLS_RSA_WITH_SEED_CBC_SHA,              SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  114  { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,      SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  115  { SSL_RSA_WITH_RC4_128_SHA,               SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
  116  { SSL_RSA_WITH_RC4_128_MD5,               SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  117  { TLS_RSA_WITH_AES_128_CBC_SHA,         SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
  118
  119 #ifdef NSS_ENABLE_ECC
  120  { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  121  { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,    SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  122 #endif /* NSS_ENABLE_ECC */
  123  { SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,      SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
  124  { SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,      SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
  125 #ifdef NSS_ENABLE_ECC
  126  { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,     SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  127  { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,   SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  128 #endif /* NSS_ENABLE_ECC */
  129  { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA,     SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  130  { SSL_RSA_WITH_3DES_EDE_CBC_SHA,          SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  131
  132
  133  { SSL_DHE_RSA_WITH_DES_CBC_SHA,           SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  134  { SSL_DHE_DSS_WITH_DES_CBC_SHA,           SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  135  { SSL_RSA_FIPS_WITH_DES_CBC_SHA,          SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  136  { SSL_RSA_WITH_DES_CBC_SHA,               SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  137  { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,     SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  138  { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,    SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  139
  140  { SSL_RSA_EXPORT_WITH_RC4_40_MD5,         SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  141  { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,     SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  142
  143 #ifdef NSS_ENABLE_ECC
  144  { TLS_ECDHE_ECDSA_WITH_NULL_SHA,          SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  145  { TLS_ECDHE_RSA_WITH_NULL_SHA,            SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  146  { TLS_ECDH_RSA_WITH_NULL_SHA,             SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  147  { TLS_ECDH_ECDSA_WITH_NULL_SHA,           SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE},
  148 #endif /* NSS_ENABLE_ECC */
  149  { SSL_RSA_WITH_NULL_SHA,                  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  150  { SSL_RSA_WITH_NULL_MD5,                  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
  151
  152 };
  • 下記オーダーでサーバにリストが送られるよだ
~/DEV/synciga/src/net/third_party/nss/ssl/sslenum.c
 
 13 /*
 14  * The ciphers are listed in the following order:
 15  * - stronger ciphers before weaker ciphers
 16  * - national ciphers before international ciphers
 17  * - faster ciphers before slower ciphers
 18  *
 19  * National ciphers such as Camellia are listed before international ciphers
 20  * such as AES and RC4 to allow servers that prefer Camellia to negotiate
 21  * Camellia without having to disable AES and RC4, which are needed for
 22  * interoperability with clients that don't yet implement Camellia.
 23  *
 24  * The ordering of cipher suites in this table must match the ordering in
 25  * the cipherSuites table in ssl3con.c.
 26  *
 27  * If new ECC cipher suites are added, also update the ssl3CipherSuite arrays
 28  * in ssl3ecc.c.
 29  */
 30 const PRUint16 SSL_ImplementedCiphers[] = {
 31     /* 256-bit */
 32 #ifdef NSS_ENABLE_ECC
 33     TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
 34     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
 35 #endif /* NSS_ENABLE_ECC */
 36     TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
 37     TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,
 38     TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
 39     TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
 40 #ifdef NSS_ENABLE_ECC
 41     TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
 42     TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
 43 #endif /* NSS_ENABLE_ECC */
 44     TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
 45     TLS_RSA_WITH_AES_256_CBC_SHA,
 46
 47     /* 128-bit */
 48 #ifdef NSS_ENABLE_ECC
 49     TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
 50     TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
 51     TLS_ECDHE_RSA_WITH_RC4_128_SHA,
 52     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
 53 #endif /* NSS_ENABLE_ECC */
 54     TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
 55     TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,
 56     TLS_DHE_DSS_WITH_RC4_128_SHA,
 57     TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
 58     TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
 59 #ifdef NSS_ENABLE_ECC
 60     TLS_ECDH_RSA_WITH_RC4_128_SHA,
 61     TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
 62     TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
 63     TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
 64 #endif /* NSS_ENABLE_ECC */
 65     TLS_RSA_WITH_SEED_CBC_SHA,
 66     TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
 67     SSL_RSA_WITH_RC4_128_SHA,
 68     SSL_RSA_WITH_RC4_128_MD5,
 69     TLS_RSA_WITH_AES_128_CBC_SHA,
 70
 71     /* 112-bit 3DES */
 72 #ifdef NSS_ENABLE_ECC
 73     TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
 74     TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
 75 #endif /* NSS_ENABLE_ECC */
 76     SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
 77     SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
 78 #ifdef NSS_ENABLE_ECC
 79     TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
 80     TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
 81 #endif /* NSS_ENABLE_ECC */
 82     SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA,
 83     SSL_RSA_WITH_3DES_EDE_CBC_SHA,
 84
 85     /* 56-bit DES "domestic" cipher suites */
 86     SSL_DHE_RSA_WITH_DES_CBC_SHA,
 87     SSL_DHE_DSS_WITH_DES_CBC_SHA,
 88     SSL_RSA_FIPS_WITH_DES_CBC_SHA,
 89     SSL_RSA_WITH_DES_CBC_SHA,
 90
 91     /* export ciphersuites with 1024-bit public key exchange keys */
 92     TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,
 93     TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,
 94
 95     /* export ciphersuites with 512-bit public key exchange keys */
 96     SSL_RSA_EXPORT_WITH_RC4_40_MD5,
 97     SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,
 98
 99     /* ciphersuites with no encryption */
100 #ifdef NSS_ENABLE_ECC
101     TLS_ECDHE_ECDSA_WITH_NULL_SHA,
102     TLS_ECDHE_RSA_WITH_NULL_SHA,
103     TLS_ECDH_RSA_WITH_NULL_SHA,
104     TLS_ECDH_ECDSA_WITH_NULL_SHA,
105 #endif /* NSS_ENABLE_ECC */
106     SSL_RSA_WITH_NULL_SHA,
107     SSL_RSA_WITH_NULL_MD5,
108
109     /* SSL2 cipher suites. */
110     SSL_EN_RC4_128_WITH_MD5,
111     SSL_EN_RC2_128_CBC_WITH_MD5,
112     SSL_EN_DES_192_EDE3_CBC_WITH_MD5,  /* actually 112, not 192 */
113     SSL_EN_DES_64_CBC_WITH_MD5,
114     SSL_EN_RC4_128_EXPORT40_WITH_MD5,
115     SSL_EN_RC2_128_CBC_EXPORT40_WITH_MD5,
116
117     0
118
119 };

このオーダーで行くと、define NSS_ENABLE_ECCの場合は、

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

そうでない場合は、

TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA

になると思われる。

サーバ側がこれを受け入れる(多分)とすると、それぞれのパフォーマンスは、ここを参考にすると、この検証にECDHE_ECDSAやWITH_CAMELLIAはないので、その次点のWITH_AES辺りをみると、

TLS_DHE_RSA_WITH_AES_256_CBC_SHA
24031

と、相当遅い。

これを、例えばSSL_RSA_WITH_RC4_128_SHAなどのcipherを使うようにすれば、

SSL_RSA_WITH_RC4_128_SHA
8562

単純比較で3倍ほど高速になると予想される。 ここでも言及されている通り、

暗号の組み合わせのネゴシエーションは、ユーザーデバイスとSecure Gatewayサーバーの間で行われます。ユーザーデバイスはユーザーデバイスで処理可能な暗号の組み合わせを、Secure Gatewayサーバーはクライアントとサーバー間の通信で使用する暗号の組み合わせを、それぞれ相互に通知します。

Secure Gatewayのサポートする暗号の組み合わせは、[行政機関レベル]および[営利企業レベル]の2つに分けられます。 [すべて]には、行政機関および営利企業の両方のレベルの暗号の組み合わせが含まれます。

営利企業レベルの暗号の組み合わせは次のとおりです。

SSL_RSA_WITH_RC4_128_MD5または{0x00,0x04}
SSL_RSA_WITH_RC4_128_SHAまたは{0x00,0x05}
行政機関レベルの暗号の組み合わせは次のとおりです。

SSL_RSA_WITH_3DES_EDE_CBC_SHAまたは{0x00,0x0A}

アメリカ合衆国の行政組織を含め、いくつかの組織では、機密事項ではないが慎重を期すべき情報を保護するために、行政の承認した暗号方式を使うことが義務付けられています。

となっていて、SSL_RSA_WITH_RC4_128_SHAでも十分だと考えられる。

アプリケーション系/libjingle/libjingleとjavaでのtlsハンドシェイク回りの実装について.txt · 最終更新: 2013/04/28 18:12 by matsumoto_r