[英]“openssl s_client -connect” exit after handshake
我正在尝试测试SSL服务器,并想检查SSL服务器是否支持特定密码。
为此,我正在使用以下命令= openssl s_client -connect google.com:443 -cipher RC4-SHA
并按如下所示从Java程序调用它并运行良好,除了我的Java程序由于openssl
进程启动而从未退出的事实仍然打开。
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 connect?
原来, Windows上的某些本机openssl客户端二进制文件存在问题 ,这意味着即使关闭了标准输入,您最终也会遇到不终止的s_client
。 如果从输出中收到一条已知行,或者从cygwin安装中复制了所需的二进制文件,以使opensl的cygwin版本正常运行,Workrounds将终止。
请注意,上一段是针对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 ...");
}
};
这基于s_client
手册页中CONNECTED COMMANDS
下的语句,该语句指出:
当以交互方式使用(这意味着
-quiet
和-ign_eof
都没有给出)时,如果该行以R
开头,并且该行以Q
开头或到达文件结尾,则将重新协商会话。关闭。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.