2

我正在尝试使用 OpenSSL 的 GnuWin32 版本从多个 WebSphere MQ 队列管理器中获取证书。所有尝试都会导致 OpenSSL 保持连接打开,直到我手动按 ENTER。

我尝试按照这个 SO question这个 SO question将各种文本输入命令,但没有运气。

理想情况下,一旦输入文件或管道文本到达 EOF,OpenSSL 就会关闭连接。

例子:

echo QUIT | openssl s_client -connect qmgrhost:1414 -showcerts 

openssl s_client -connect qmgrhost:1414 -showcerts < responsefile.txt

使用该QUIT命令的示例似乎适用于其他 SO 问题,因为它们正在访问 HTTP 服务器。由于在我的情况下这是 WMQ,因此连接握手是不同的,并且发送QUIT(或我尝试过的其他任何东西)不会让它关闭连接。我可能会向它提供一个巨大的文件,直到 QMgr 阻塞并终止连接,但我试图对服务器尽可能礼貌。当前从键盘提供 ENTER 的方法会导致每个连接上的 FDC 转储,引发各种警报并使 Tivoli 家伙生我的气。

所以最好的情况是 QMgr 解释为优雅拒绝并关闭连接的字符串或十六进制值。第二个最佳情况是允许脚本化的任何方法,我们将接受 FDC 文件作为自动化此功能的成本。

更新:2013 年 5 月 31 日
我已经搬到了 AIX,它完美地工作。s_client 在脚本中运行时在建立连接后立即挂断并将换行符输入其中。但是,我仍然希望有一个适用于 Windows 的解决方案。有谁知道 Cygwin 版本是否有效或有同样的问题?是 Windows 信号/POSIX 问题吗?代码错误?

4

1 回答 1

5

这个问题似乎与批处理文件和 openssl.exe 程序之间的同步问题有关。我需要您的合作才能进行一些测试并报告结果。下面是第一个测试的 Batch-JScript 混合脚本。JScript 部分有两个部分;第一个WScript.Stdout.WriteLine("QUIT");完全等同于echo QUIT批处理命令。第二部分(两行)类似,但它使用“QUIT”和 Enter 键加载键盘缓冲区,而不是通过 STDOUT 发送字符串。

我需要您对 JScript 代码的两个部分进行测试并报告结果(双斜线//将行的其余部分标记为注释)。如果幸运的话,openssl.exe程序将以Sendkeys方法结束;如果没有,请尝试发送一个“QUIT”字符串,STDOUT然后输入一个 Enter 键Sendkeys。如果openssl.exe程序在返回所需信息之前终止,那么问题几乎解决了,因为在这种情况下,我们可以同步发送 Enter 键,直到从openssl.exe.

将以下内容另存为.bat文件。尝试一下,然后注释掉该Wscript行,取消注释该WshShell行,然后再试一次。

@if (@CodeSection == @Batch) @then

:: The first line above is...
:: in Batch: a valid IF command that does nothing.
:: in JScript: a conditional compilation IF statemente that is false,
::             so this section is omitted until next "at-sign end".

@echo off
CScript //nologo //E:JScript "%~F0" | openssl s_client -connect qmgrhost:1414 -showcerts 
goto :EOF


@end


// JScript section

WScript.Stdout.WriteLine("QUIT");

// var WshShell = WScript.CreateObject("WScript.Shell");
// WshShell.SendKeys("QUIT{ENTER}");

您也可以尝试在或方法String.fromCharCode(26)中生成 Ctrl-Z (EOF) 字符;例如:WriteLineSendkeys

WshShell.SendKeys("QUIT{ENTER}" + String.fromCharCode(26));
于 2013-06-01T04:17:38.143 回答