2014-02-22 19 views
2

我正在使用基于Java的Web服务器(PlayFramework 2.2 FWIW - 请参阅very good write up on TLS),我想调试各种设备的SSL通信,例如:Android,以查看就TLS而言,究竟是什么在线上发生。为此,我可以使用Wireshark to decrypt the SSL layer。这工作,如果服务器不创建一个临时密钥,为explained nicely by Steven Iveson限制基于Java的Web服务器TLS协议以供Wireshark检查

要点:确保使用的Diffie-Hellman短暂(DHE/EDH)或 RSA短暂的密码套件没有在两台主机之间协商。 这通过使用ServerKeyExchange消息来表示。在使用临时密码的地方,没有办法解密数据。

Java Secure Sockets Extension Reference Guide section on how to Disable Algorithms点,我曾尝试在$JAVA_HOME/jre/lib/security/java.security文件中直接设置为

jdk.tls.disabledAlgorithms=DH, ECDH, EDCHE, DiffieHellman 

我使用了一些Java™ Cryptography Architecture Standard Algorithm Name Documentation为尝试选择那些字符串中的一个尝试jdk.tls.disabledAlgorithms属性,但我一直在野外挑选一点。

我试着设置也使用它的代码

java.security.Security.setProperty("jdk.tls.disabledAlgorithms","ECDH, ECDHE, ECDHE_RSA, DiffieHellman") 

但是这似乎并没有停止ServerKeyExchange消息的外观,如图Wireshark的1.11.2对OSX的截图:screenshot of Wireshark 1.11.2 on OSX 。事实上,我似乎无法解密流。

任何想法我可能做错了什么?

回答

1

我很接近。答案似乎是设置安全属性,如下所示:

jdk.tls.disabledAlgorithms=DHE, ECDHE 

(我来了,阅读热现成的,按博客文章后:JDK 8 will use TLS 1.2 as default)。

一旦设置在服务器上,Wireshark捕获的https连接不再显示Server Key Exchange消息。

Wireshark on OSX showing a TLS 1.2 communication without perfect forward secrecy key negotiation

然后可以解密通过电线就见下面的图片

picture of unencrypted communication

我希望尝试分析一下Android的手机是当这将是有用的内容通过电线接收。

+0

时,我会回到您的观点。如果有帮助,则字符串列表在[SSLAlgorithmConstraints.java](http://grepcode.com/file/)中定义repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/security/ssl/SSLAlgorithmConstraints.java#265) –

+0

如果java客户端脚本正在从Windows机器运行,那么可以禁用它作为以及具体如何?该服务器是一个Apache服务器,数据包也被发现无法解密。 – vbNewbie

+0

我想出了如何在Windows上执行此操作,但只想验证此设置是否可确保运行的客户端脚本不会在其httpwebrequests中使用算法加密? – vbNewbie

1

不知道这是否会帮助,但尝试做一个特权块中:

AccessController.doPrivileged(
    new PrivilegedExceptionAction[Unit]() { 
    java.security.Security.setProperty("jdk.tls.disabledAlgorithms","ECDH, ECDHE, ECDHE_RSA, DiffieHellman") 

    } 
) 
+0

为了消除我是否正确设置Security属性的任何疑问,我将它直接设置在作为JRE一部分的'$ JAVA_HOME/jre/lib/security/java.security'文件中。为了消除所有的疑惑,我添加了'println(“jdk.tls.disabledAlgorithms =”+ java.security.Security.getProperty(“jdk.tls.disabledAlgorithms”))' 到我的代码,并打印出'jdk.tls .disabledAlgorithms = DiffieHellman,ECMQV,ECDH,EDCHE,DH'到我的控制台。 (这是我尝试过的最新一组字符串)。当我解决问题并获得编程尝试设置属性 –