【问题标题】:How does java picks the strongest cipher to use in jsse?java如何选择最强的密码在jsse中使用?
【发布时间】:2012-04-24 09:44:51
【问题描述】:

我不明白 Java 如何选择最喜欢的密​​码用于 Server Hello

我有一个 Tomcat 5 配置,我在 SSL 连接器中设置了 ciphers=TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, etc

服务器,即 Java 选择 Server Hello 上的 TLS_RSA_WITH_AES_128_CBC_SHA 作为客户端支持的首选。但这不是最安全的,也不是http://docs.huihoo.com/java/javase/7/technotes/guides/security/SunProviders.html#SunJSSEProvider 的首选编码,它列出了TLS_RSA_WITH_AES_256_CBC_SHA 的首选。
然后我认为是 server.xml 属性中的顺序产生了影响,我首先放置了另一个密码 (TLS_DHE_RSA_WITH_AES_256_CBC_SHA),我在 Client Hello 中看到它是受支持的。但这也没有被选中,TLS_RSA_WITH_AES_128_CBC_SHA 再次被选中。

那么 JSSE 是如何选择偏好密码的呢?这是在某处记录的吗?我无法弄清楚这里发生了什么。

【问题讨论】:

    标签: java security tomcat ssl jsse


    【解决方案1】:

    没必要。 RFC 2246 所说的只是“服务器将选择一个密码套件”。它没有任何地方说它会选择最安全的,或者说它会如何做出选择。

    【讨论】:

    • 奇怪。所有文献都说服务器选择最安全的,例如en.wikipedia.org/wiki/Transport_Layer_Security 作为一个微不足道的样本。我错了吗?但即使如您所指出的那样未指定,SUN 似乎也在宣传优先顺序docs.oracle.com/javase/6/docs/technotes/guides/security/…。它说:The table below shows the ciphersuites supported by SunJSSE in their default preference order 所以似乎有一个偏好顺序还是我在这里误解了它?
    • @Jim 维基百科的引文并没有说明我能看到的关于选择最强密码套件的任何内容,如果确实如此,它就超出了 RFC。如果 JSSE 被记录为对密码套件使用特定的优先顺序,那么它应该是这样的,但 RFC2246 并不要求这样做。
    • @Jim 所以维基百科错了。不会是第一次。我已经修好了。 RFC 确实说客户端指定 他的 优先顺序,但这是服务器的选择。您可以使用 setEnabledCipherSuites() 更改 JSSE 中启用的密码套件,但 Javadoc 中没有任何内容表明您指定的顺序成为优先顺序。
    • 我发现了这个:bugs.sun.com/bugdatabase/… 似乎实现是只为客户端尊重优先顺序。对于服务器,他们只选择从客户端启用的第一个。这与我的实验一致。所以 JSSE 参考似乎也不正确。而且太模糊(选择了“最佳”。就什么而言最佳?)
    【解决方案2】:

    要实现的一点:客户在选择中也有发言权。如果客户说它只能支持 128 位密码,那么这就是将被选中的密码。通过删除除那个以外的所有受支持的密码,查看您的客户甚至支持 AES 256。

    您没有按优先顺序提供密码列表。您正在提供必须与客户端匹配的可接受密码列表。如果其中任何一个不可接受,请将其删除。

    【讨论】:

    • 我知道握手。客户端确实支持AES 256(发送Client Hello)并且我测试的密码都被客户端支持。没有偏好顺序? SUN 发布优先顺序docs.oracle.com/javase/6/docs/technotes/guides/security/… 它说:The table below shows the ciphersuites supported by SunJSSE in their default preference order。我是否理解他们声明中“优先顺序”的含义
    • 不,你没有记错。请注意,TLS_RSA_WITH_AES_128_CBC_SHA 高于 TLS_RSA_WITH_AES_256_CBC_SHA,因此首先选择它。
    • 你是对的。不知怎的,我没有注意到这一点。我注意到,如果我从列表中删除 TLS_RSA_WITH_AES_128_CBC_SHA,则选择 256_CBC_SHA。我想知道default preference orderdefault 语句的含义是什么。我可以配置不同的偏好顺序吗? IE。配置启用的密码并选择例如更强的或EC之前的DH
    • 根据我的经验,控制服务器选择哪一个的客户端密码列表非常重要。例如,我的密码列表在顶部位置有 ECDH 密码,然后是 SSL_RSA_WITH_AES_128_CBC_SHA256。但是,因为证书没有指定 EC 参数,所以它总是选择 RSA 版本。但是,当我将除此之外的所有内容和 SSL_DHE_RSA_WITH_AES_128_CBC_SHA256 之外的所有内容都拿出来时——将后者放在首位——它选择了后者。因此,根据我的经验,在服务器做出决定时,顺序似乎很重要。被诅咒的 oracle/ibm 排序:P
    【解决方案3】:

    虽然您关于 2246(或 5256)并没有说服务器按照客户端提供的优先顺序从相互支持的密码套件中选择密码套件的说法是正确的,但 NIST 800-57 第 3 部分,第 4.3 节,采购指导,状态:

    1. 实现应按照客户端提交的优先顺序选择密码套件。

    【讨论】:

    • 谁的声明? OP没有说明这一点。你指的是我的声明吗?
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2019-03-28
    • 2014-01-02
    • 2014-01-28
    相关资源
    最近更新 更多