"没有共享密码"尝试从Android到服务器的SSL连接时出错

时间:2014-11-28 16:31:08

标签: java android ssl tcl

每当我尝试使用SSL从Android应用程序连接到Tcl服务器时,连接都会失败。这两个系统似乎都有很长的受支持密码列表,但是它们的名称却截然不同,所以我无法确定哪个是哪个。

Tcl错误消息是:

SSL channel "sock7": error: no shared cipher

Android错误消息是:

javax.net.ssl.SSLException: Connection closed by peer

有没有希望为此找到解决方案?

Tcl代码是:

package require tls
::tls::init  -ssl2 0 -ssl3 1 -tls1 1 -require 0 -request 0
set mainSock [::tls::socket -server serve 1200]

Android代码是:

import javax.net.SocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("server.de", 1200);

3 个答案:

答案 0 :(得分:1)

感谢大家的帮助。我已经找到了你的答案。

似乎不可能将Tcl用作没有任何证书的服务器。甚至没有其他Tcl脚本也可以在没有证书的情况下连接到服务器客户端可以省略有效性检查,但服务器必须提供证书。 文档中没有明确说明这一点!

现在,我可以使用第http://wiki.tcl.tk/15244

中所述的自制证书建立连接

不幸的是,我(还)不知道如何告诉Android现在不检查有效性(如Tcl中的-require 0)。也许我只是将自己的CA导入到Android设备中。否则,我将不得不购买由官方CA签署的证书。将来的某个时候,无论如何我都必须这样做。

答案 1 :(得分:0)

密码套件的名称可以不同,但​​它们共享相同的价值"。错误消息明确指出没有通用密码套件。这可能是由于许多原因造成的。一些但不是全部:

  1. 服务器上的SSL证书基于ECC与RSA(不同的算法)。
  2. 对于启用的TLS协议,两端没有任何通用的密码套件。
  3. 密码套件列表及其#34;值":

    https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4

答案 2 :(得分:0)

由于您的SSL服务器不使用任何证书,因此唯一可能的密码是匿名密码套件。由于这些是不安全的(对中间人攻击开放),因此SSLSockets默认不启用它们。 因此,客户端将仅宣布对具有适当身份验证的密码套件的支持,并且它不会提供可用于您的TCL服务器的任何密码。这会导致“无共享密码”错误。

如果你真的想使用这种不安全的设置,你可以查看http://www.nickoh.com/emacs_files/ssl-examples/LdapTlsExample.java.txt一个使用匿名密码套件和SSLSockets的例子(我没有检查示例是否有效,它只是其中之一搜索anon密码套件支持时的第一次点击。)