2011-08-28 62 views
0

我想通过TCP/IP,使用SSLSockets获得SSL通信。一旦我得到SSLSocket并请求InputStream,我就会在java(主机)端获得“无共同套件共同”异常,并且在客户端获得:“javax.net.ssl.SSLProtocolException:SSL握手中止: ssl = 0x1b3da8:SSL库失败,通常是协议错误“。所以我所做的就是列出Android端的每个可用密码套件,并在服务器端启用它们。仍然有同样的例外。“没有密码套房共同”java主机和Android客户端

然后,我添加以下行前获取输入流:

sslSocket.setEnabledCipherSuites(sslSocket.getSupportedCipherSuites()); 

和工作。显然,我不能在生产环境中使用它,因为我想确保安全加密正在发生。

那么我做错了什么?

在此先感谢

+0

您有权访问服务器吗?你在服务器端检查了支持的密码吗?如果使用桌面浏览器连接到服务器,那么使用什么密码套件? – Robert

回答

3

通常这表示服务器密钥库的配置错误。如果服务器找不到有效的私钥,那么它可以使用的唯一密码套件就是匿名diffie-hellman密码套件。通常这些在大多数平台上因安全原因被禁用。

+0

如果您不介意我提问,这些安全原因是什么? – ajacian81

+3

@ ajacian81安全原因是SSL是不安全的,除非至少有一个对等端被认证。有关详细信息,请参阅RFC 2246。 – EJP

1

使用openssl s_client -connect youserver:443检查什么协议(TLS1,在SSLv3)和密码(RC4-SHA,AES-SHA等),用于连接到服务器。然后在Android客户端启用此密码(如果密码足够安全)。如果不是,请确保在服务器上启用安全密码套件。您可能还想列出Android侧的sslsocket.getEnabledCipherSuites,以查看默认情况下可用的功能。

+0

我试过了,并在Android设备上添加了所有启用的密码套件,以便在java服务器上使用。仍然没有运气。只有上面的代码行才能做到这一点? – ajacian81

+0

你能用s_client或其他程序连接到你的服务器吗?正如@GregS所说的,可能它没有正确配置。 –