GnuWin32 openssl s_client conn到WebSphere MQ服务器未关闭EOF,挂起

时间:2013-05-29 20:18:07

标签: batch-file openssl ibm-mq gnuwin32

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

我尝试将各种文本输入命令as per this SO questionthis 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问题吗?代码错误?

1 个答案:

答案 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)字符,包括WriteLineSendkeys方法;例如:

WshShell.SendKeys("QUIT{ENTER}" + String.fromCharCode(26));