【问题标题】:How to map a OpenSSL's cipher list to Java JSSE如何将 OpenSSL 的密码列表映射到 Java JSSE
【发布时间】:2013-11-19 16:38:30
【问题描述】:

我遵循了建议使用的 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'

【问题讨论】:

    标签: tomcat openssl jetty jsse


    【解决方案1】:

    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 ciphers -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
    

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

    【讨论】:

    • 这正是我想要的,谢谢。
    【解决方案2】:

    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
    

    【讨论】:

    • 链接消失了,但这个(第三方)网站在写作时提供了相同的信息。 testssl.sh/openssl-rfc.mappping.html
    • 对于未来的读者,参考的 OpenSSL 文档现在可以在 here 找到。
    【解决方案3】:

    获取 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}'
    

    【讨论】:

      【解决方案4】:

      有一种简单的方法可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多