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));
Другие вопросы по тегам