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

T.R*_*Rob 2 openssl batch-file gnuwin32 ibm-mq

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

我尝试按照这个SO问题这个SO问题将各种文本传送到命令,但是没有运气。

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

例子:

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

openssl s_client -connect qmgrhost:1414 -showcerts < responsefile.txt
Run Code Online (Sandbox Code Playgroud)

使用QUIT命令的示例似乎在另一个SO问题中也可以使用,因为它们正在命中HTTP服务器。因为在我的情况下这是WMQ,所以连接握手是不同的,发送QUIT(或我尝试过的其他任何操作)不能使它关闭连接。在QMgr阻塞并终止连接之前,我可能会向其提供一个巨大的文件,但我正在尝试对服务器尽可能礼貌。从键盘提供ENTER的当前方法是按原样在每个连接上引起FDC转储,引发各种警报并使Tivoli伙计们生我的气。

因此,最好的情况是QMgr将该字符串或十六进制值解释为正常拒绝并关闭连接。第二好的情况是任何允许对此脚本编写脚本的方法,我们将接受FDC文件作为自动执行此功能的代价。

更新:2013年5月31日,
我此后搬到了AIX,它在这里非常有效。在脚本中运行并在其中插入换行符后,建立连接后,s_client立即挂断。但是,我仍然希望有Windows的解决方案。有人知道Cygwin版本是否有效或存在相同问题吗?Windows信令/ POSIX问题吗?代码错误?

Aac*_*ini 5

似乎此问题与批处理文件和openssl.exe程序之间的同步问题有关。我需要您的协作才能进行一些测试并报告结果。下面是第一个测试的Batch-JScript混合脚本。JScript部分包含两个部分;第一个WScript.Stdout.WriteLine("QUIT");完全等同于echo QUITBatch命令。第二部分(两行)相似,但是它向键盘缓冲区加载了“ 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}");
Run Code Online (Sandbox Code Playgroud)

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

WshShell.SendKeys("QUIT{ENTER}" + String.fromCharCode(26));
Run Code Online (Sandbox Code Playgroud)

  • 是的。我不喜欢 JScript 多行注释方法,因为它有点令人困惑,而且结束的 `*/` 可能会被忽视!我认为我使用“@end”分隔符的方法更加清晰。 (2认同)