如何检查服务器是否支持使用Java的SSL?

时间:2015-08-17 14:53:58

标签: java ssl encryption

我需要检查服务器是否支持SSL和来自Web服务器的密码。

我在Java中查看了SSLSocket,但我没有让它正常工作。

我使用方法getSupportedProtocols()它总是为每个网址提供相同的协议。此外,我没有得到从服务器给出的密码。我猜测getEnabledCipherSuites()将是正确的方法

try {
    SSLContext ctx = SSLContext.getDefault();
    ctx.getClientSessionContext().setSessionTimeout(5); // in seconds
    SSLSocket socket = (SSLSocket) ctx.getSocketFactory().createSocket("host.com", 443);

    socket.setSoTimeout(5000); // in millis
    String[] result = socket.getEnabledCipherSuites();
    Arrays.sort(result);
    for (int i = 0; i < result.length; i++) {
        System.out.println(result[i]); 
    }
 } catch (IOException ex) {
     System.out.println("Error!");
 }

如何检查服务器是否使用SSL?从服务器返回了哪些密码?

2 个答案:

答案 0 :(得分:5)

getSupportedProtocols()/CipherSuites()会返回您的身边可以支持的协议和密码列表。 getEnabledProtocols()/CipherSuites()会返回您身边启用的这些列表的子集。

它不会告诉你有关服务器支持的内容。

根据TLS规范,客户端发送可以使用的最高协议版本以及它想要使用的密码套件列表。然后,服务器使用它在该列表中支持的最高协议(如果有的话),并在该列表中选择它想要的密码套件(如果有的话)。

关于密码套件选择的完成方式有一定的灵活性(例如,参见SSLHonorCipherOrder directive in Apache Httpd)。

基本上,如果您想查看服务器实际支持哪些密码套件,您必须遍历您支持的每个密码套件并逐个启用它们以尝试握手。

答案 1 :(得分:0)

  

使用getSupportedProtocols()方法,它总是为每个url提供相同的协议。

它始终为您提供最终支持的协议。每个网址都不会改变。

  

此外,我没有得到服务器提供的密码。我猜测getEnabledCipherSuites()将是正确的方法。

你猜错了。它为您提供了支持您的密码。

  

如何检查服务器是否使用SSL?

调用startHandshake()并捕获异常。

  

从服务器返回了哪些密码?

你不能,但你可以通过查看SSLSession来判断协商密码套件。