如何定义(在Java中)服务器使用哪种加密协议(SSL或TLS)?

时间:2013-09-27 14:30:41

标签: java ssl apache-commons-httpclient

我有Client Application,它使用apache-commons-httpclient 2.0,我需要连接到不同的服务器。 作为加密协议,我使用:

protocols = new String[]{"SSLv3", "SSLv2Hello", "TLSv1"};
((SSLSocket) socket).setEnabledProtocols(protocols);

通常,它工作正常,但对于某些服务器,会发生以下情况:

main, handling exception: java.net.SocketException: Software caused connection abort: recv failed
main, SEND SSLv3 ALERT:  fatal, description = unexpected_message
Padded plaintext before ENCRYPTION:  len = 22
0000: 02 0A 7B FA 57 7E 6E B7   56 4C 8A 2F 7F 1F BC 9F  ....W.n.VL./....
0010: A6 80 57 12 0B EE                                  ..W...
main, WRITE: SSLv3 Alert, length = 22
main, Exception sending alert: java.net.SocketException: Software caused connection abort: socket write error

如果我从协议列表中删除TLSv1,它将适用于此服务器,我将获得200状态。 因此,我有这个问题 - 如何预先定义服务器支持哪种协议(SSL或TLS)和协议版本?

或许还有其他方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

好的,我已经找到了如何获得启用的服务器协议:

Socket socket = sSLSocketFactory.createSocket(host, port);
((SSLSocket) socket).getEnabledProtocols();

但它没有帮助,因为它给了我:

SSLv2Hello
SSLv3
TLSv1

这意味着服务器应该支持TLSv1。所以问题出在其他地方。