【问题标题】:"openssl s_client -connect" exit after handshake握手后“openssl s_client -connect”退出
【发布时间】:2015-09-15 13:10:06
【问题描述】:

我正在尝试测试 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 连接?

【问题讨论】:

  • 在等待进程终止之前关闭输出流应该可以解决问题
  • @MrDownVoter:有什么解释吗?太差劲了,你直接投反对票就跑了,还敢解释!!!

标签: java openssl


【解决方案1】:

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

请注意,前一段是针对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 手册页中CONNECTED COMMANDS 下的语句,该语句指出:

交互使用时(这意味着-quiet 也没有给出-ign_eof),如果该行以R 开头,并且如果该行以Q 开头或如果到达文件结尾,则将重新协商会话,则连接将被关闭。

【讨论】:

  • 感谢您的输入 .. 不工作 .. 它关闭了连接,但由于超时.. 我得到了这个回复 Timeout : 300 (sec) ..
  • 我的代码是否可以在您的系统上运行?我已经在 OSX 和 Linux (openJDK 1.7.0_85) 上对其进行了测试,并且都按预期工作。您确定将process.getOutputStream().close() 放在 process.waitFor() 之前?
  • 哦,是的,先生.. 100% .. 没用.. 你试过没有process.getOutputStream().close() 吗?我认为它也会对你有用..
  • 实际上,我建议的另一件事是轻微重构,将输出读取 before waitFor() 以防止缓冲相关问题。但是,不关闭流会总是触发超时
  • 我发现很难重现您所看到的内容。我有pastebinned确切地我正在运行什么以及它的响应速度。诸如您正在运行的内容之类的详细信息会有所帮助,但是我已经在 OSX、Linux Windows(32 位和 64 位 VM)上进行了尝试,但在测试后看不到它的实际效果跨越那么多环境。我直接连接到互联网,并且没有为 TLS 流量使用任何代理。请注意……谷歌会因为不良连接的数量而限制您的速率吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
相关资源
最近更新 更多