握手后“openssl s_client -connect”退出

时间:2015-09-15 13:10:06

标签: java openssl

我正在尝试测试SSL服务器,并想检查SSL服务器是否支持特定的密码。

为此,我使用以下命令= openssl s_client -connect google.com:443 -cipher RC4-SHA并从Java程序调用它,如下所示并且运行良好,除了我的Java程序永远不会退出,因为openssl进程启动仍然ON。

        Process process = Runtime.getRuntime().exec("openssl s_client -connect google.com:443");
        System.out.println("Waiting for process to terminate ...");
        process.waitFor();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = "";
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println("Exiting ...");

我看到有类似openssl s_client -connect google.com:443 -verify 0的内容,但这是错误返回代码,并不会获取我要查找的信息,但它会停止openssl进程。

一旦客户端 - 服务器握手完成,有没有办法退出openssl连接?

1 个答案:

答案 0 :(得分:3)

原来有一个problem with some native openssl client binaries on windows,这意味着即使关闭标准输入,也会以非终结s_client结束。如果您从输出中收到已知行,或者从cygwin安装中复制所需的二进制文件以使openssl的cygwin版本无问题地运行,则Workround将终止。

请注意,前一段是针对 Windows 的问题,后面的段落完全适用于Linux / OSX。

process.waitFor()之前,我们调用process.getOutputStream().close()并关闭openssl s_client的输入流;它会触发它的自动终止逻辑。我们关闭stderr,以获得良好的衡量标准。另一件事是在等待进程终止之前移动输出读取,以防缓冲区在操作系统级别被填充。

import java.io.*;

public class props {
    public static void main(String[] args) throws Exception {
        Process process = Runtime.getRuntime().exec("openssl s_client -connect google.com:443");
        process.getOutputStream().close();
        process.getErrorStream().close();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = "";
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println("Waiting for process to terminate ...");
        process.waitFor();
        System.out.println("Exiting ...");
    }
};

这是基于CONNECTED COMMANDS手册页中s_client下的声明,其中声明:

  

交互使用时(这意味着-quiet          如果该行以-ign_eof开头,并且该行以R开头或者如果文件末尾已到达,则会话将重新协商,连接将关闭。