我正在尝试使用GnuWin32版本的OpenSSL从多个WebSphere MQ队列管理器获取证书。所有尝试都会导致OpenSSL保持连接打开,直到我手动点击ENTER。
我尝试将各种文本输入命令as per this SO question和this 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问题吗?代码错误?
答案 0 :(得分:5)
似乎此问题与批处理文件和openssl.exe程序之间的同步问题有关。我需要您的协作才能进行一些测试并报告结果。下面是第一个测试的Batch-JScript混合脚本。 JScript部分有两部分;第一个WScript.Stdout.WriteLine("QUIT");
完全等同于echo QUIT
批处理命令。第二部分(有两行)是类似的,但它用“QUIT”和Enter键加载键盘缓冲区,而不是通过STDOUT发送字符串。
我需要您使用JScript代码的两个部分进行测试并报告结果(双斜杠//
将该行的其余部分标记为注释)。如果幸运的话,openssl.exe
程序将以Sendkeys
方法结束;如果没有,请尝试通过STDOUT
发送“退出”字符串,然后只输入带有Sendkeys
的Enter键。如果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)字符,包括WriteLine
或Sendkeys
方法;例如:
WshShell.SendKeys("QUIT{ENTER}" + String.fromCharCode(26));