GnuWin32 openssl s_client соединяется с сервером WebSphere MQ, не закрывающимся в EOF, зависает
Я пытаюсь использовать версию OpenSSL GnuWin32 для получения сертификатов от нескольких администраторов очередей WebSphere MQ. Все попытки приводят к тому, что OpenSSL сохраняет соединение открытым, пока я не нажму ENTER вручную.
Я попытался вставить в команду различный текст в соответствии с этим и таким вопросом, но безуспешно.
В идеале OpenSSL закрыл бы соединение, как только входной файл или текст по конвейеру достигнет EOF.
Примеры:
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 в качестве платы за автоматизацию этой функции.
ОБНОВЛЕНИЕ: 31 мая 2013
С тех пор я переехал в AIX, где это работает отлично. S_client зависает сразу после установления соединения, когда запускается в скрипте и запускает в него новую строку. Тем не менее, я все еще хотел бы иметь решение для Windows. Кто-нибудь знает, работает ли версия Cygwin или есть такая же проблема? Это сигнализация Windows / проблема POSIX? Ошибка кода?
1 ответ
Похоже, что эта проблема связана с проблемой синхронизации между Batch-файлом и программой openssl.exe. Мне нужно ваше сотрудничество, чтобы провести несколько тестов и сообщить о результате. Ниже приведен гибридный скрипт Batch-JScript для первого теста. Раздел JScript состоит из двух частей; первый WScript.Stdout.WriteLine("QUIT");
полностью эквивалентно echo QUIT
Пакетная команда. Вторая часть (с двумя строками) похожа, но она загружает буфер клавиатуры клавишей "QUIT" и клавишей "Enter" вместо отправки строки через STDOUT.
Мне нужно, чтобы вы сделали тест с обоими разделами кода JScript и сообщили результат (двойной слеш //
отметить оставшуюся часть строки как комментарий). Если нам повезет, то openssl.exe
Программа закончится с Sendkeys
Способ; если нет, попробуйте отправить строку "QUIT" через STDOUT
и введите просто клавишу ввода с 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), оба в WriteLine
или же Sendkeys
методы; например:
WshShell.SendKeys("QUIT{ENTER}" + String.fromCharCode(26));