我正在尝试测试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连接?
答案 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
开头或者如果文件末尾已到达,则会话将重新协商,连接将关闭。