如何将OpenSSL的密码列表映射到Java JSSE

时间:2013-11-07 20:28:30

标签: tomcat openssl jetty jsse

我已按照Hardening your web servers ssl ciphers指南建议使用

ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS

但是我正在尝试配置基于纯Java(Tomcat,Jetty)的WebServer,而不是基于Apache或OpenSSL的Web服务器。如何确定哪些JSSE密码名称对应于

的结果
openssl ciphers -V 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS'

4 个答案:

答案 0 :(得分:13)

Java的JSSE密码套件名称对应于标准TLS Cipher Suite List,您可以在其中下载官方代码及其名称的CSV文件。 CSV文件名为'tls-parameters-4.csv'。使用一个小的shell脚本,您可以将OpenSSL名称映射到JSSE名称 - 通过密码的官方十六进制代码。

$ cat openssl2jsse.sh 
#!/bin/bash
CODE=`openssl ciphers -V  | grep $1 | sed 's/ //g' | cut -d '-' -f1 `
grep $CODE tls-parameters-4.csv | cut -d ',' -f3

$ cat resolve.sh 
#!/bin/bash
COMBINEDLIST=
while read line
do
        ENTRY=`./openssl2jsse.sh $line`
        echo $ENTRY
        COMBINEDLIST=$COMBINEDLIST,$ENTRY
done
echo "ciphers="$COMBINEDLIST

将openssl密码-V的输出传递给resolve.sh脚本将导致正确排序的java密码套件列表。

$ openssl ciphers -V 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS' | ./resolve.sh
... 
ciphers=,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA

此脚本可以节省一些手动映射值列表的时间。

答案 1 :(得分:5)

OpenSSL在线文档包含密码套件名称的映射。 请参阅OpenSSL cipher suite names

例如:

TLS v1.0 cipher suites.
TLS_RSA_WITH_NULL_MD5                   NULL-MD5
TLS_RSA_WITH_NULL_SHA                   NULL-SHA
TLS_RSA_EXPORT_WITH_RC4_40_MD5          EXP-RC4-MD5
TLS_RSA_WITH_RC4_128_MD5                RC4-MD5
TLS_RSA_WITH_RC4_128_SHA                RC4-SHA
TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5      EXP-RC2-CBC-MD5
TLS_RSA_WITH_IDEA_CBC_SHA               IDEA-CBC-SHA
TLS_RSA_EXPORT_WITH_DES40_CBC_SHA       EXP-DES-CBC-SHA
TLS_RSA_WITH_DES_CBC_SHA                DES-CBC-SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA           DES-CBC3-SHA

答案 2 :(得分:0)

获取IANA TLS参数文件:

wget https://www.iana.org/assignments/tls-parameters/tls-parameters-4.csv

将OpenSSL密码名称映射到标准密码名称,保留顺序:

openssl ciphers -V 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!eNULL:!LOW:!MD5:!EXP:!RC4:!SEED:!DSS' | awk '{print $1}' | xargs -i grep -F '{}' tls-parameters-4.csv | awk -F, '{print $3}'

答案 3 :(得分:0)

有一种简单的方法可以使用 ruby​​ 中的 tls-map 库将任何 OpenSSL(或 GnuTLS、NSS 等)密码名称转换为 IANA/标准/RFC 密码名称:

require 'tls_map'

tm = TLSmap::App.new

tm.search(:openssl, 'AES128-SHA', :iana) #=> {:iana=>"TLS_RSA_WITH_AES_128_CBC_SHA"}

它也可用作 CLI 工具:

$ tls-map search openssl AES128-SHA -o iana
iana: TLS_RSA_WITH_AES_128_CBC_SHA