Вопрос:
Я использую версию IBM WebSphere MQ 8.0.
Я сконфигурировал один из моих каналов с помощью шифрования Cipher Specification TLS_RSA_WITH_AES_256_CBC_SHA256 вместе с действительными сертификатами, установленными и правильно настроенными на путь хранения ключей.
Мой клиентский код.NET не может подключиться к этому защищенному каналу. Он дает ошибку 2538 непрерывно. У меня есть другой канал, настроенный без шифрования (необеспеченный). Клиентский код может подключаться к этому каналу без каких-либо ошибок.
Это мой клиентский код.NET:
Hashtable queueProperties = new Hashtable(); queueProperties[MQC.HOST_NAME_PROPERTY] = host; // IP address queueProperties[MQC.PORT_PROPERTY] = 1541 queueProperties[MQC.CHANNEL_PROPERTY] = channel; // channel name queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED; queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = «*USER»; queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = «TLS_RSA_WITH_AES_256_CBC_SHA256»; queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = «CN=FXCMTST1,O=IBM,C=US»; queueProperties[«CertificateLabel»] = «ibmwebspheremqfxcmtst1»; queueProperties[MQC.KEY_RESET_COUNT] = 0; MQEnvironment.SSLCertRevocationCheck = true; queueProperties[MQC.USER_ID_PROPERTY] = user; // variable queueProperties[MQC.PASSWORD_PROPERTY] = pwd; // variable try { // Attempt the connection queueManager = new MQQueueManager(qmgr, queueProperties); strReturn = «Connected Successfully»; }
Я также установил для пользователя MCA действительного пользователя со всеми необходимыми правами доступа.
Вышеприведенный код отлично работает для незащищенного канала, когда я удаляю эти строки и заменяю имя канала на необеспеченный.
queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED; queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = «*USER»; queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = «TLS_RSA_WITH_AES_256_CBC_SHA256»; queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = «CN=FXCMTST1,O=IBM,C=US»; queueProperties[«CertificateLabel»] = «ibmwebspheremqfxcmtst1»; queueProperties[MQC.KEY_RESET_COUNT] = 0; MQEnvironment.SSLCertRevocationCheck = true;
Я что-то пропустил в конфигурации кода или MQ?
ОБНОВЛЕНИЕ 1: Я обнаружил, что ошибка связана с неправильным доступом к базе данных ключей. Я упомянул путь до имени папки, где были размещены сертификаты. Однако, как ожидается, это имя папки, за которой следует имя файла kdb без расширения.
После этого изменения ошибка 2538 исчезла. Но теперь я получаю ошибку 2059 с сообщением об ошибке ниже в журнале.
“CipherSpec, согласованный во время установления связи SSL, не соответствует требуемому CipherSpec для канала…”
Мой канал настроен на наличие “TLS_RSA_WITH_AES_256_CBC_SHA256”, как я установил в MQ Explorer. Клиентский код также отправляет одну и ту же спецификацию шифрования. Тем не менее он дает ошибку 2059.
ОБНОВЛЕНИЕ 2: Как было предложено @JoshMc, я установил групповую политику и устранил ошибку выше. Затем я начал получать ошибку “Отсутствует сертификат канала”.
ОБНОВЛЕНИЕ 3: Эта ошибка исчезла после того, как я сменил SSLCAUTH на OPTIONAL. Раньше он был установлен в ТРЕБУЕТСЯ. Спасибо @JoshMc за указание.
Лучший ответ:
Первоначально в вашем вопросе у вас была следующая строка кода:
queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = «ibmwebspheremqtestqueue»;
Я посоветовал: SSL_PEER_NAME_PROPERTY предназначен для проверки части или всего значения DN для сертификата диспетчера очереди, поэтому он будет иметь формат CN=x.domain.com,OU=Y,O=Company Inc, то, что вы выглядят как ярлык cert.
Вы видите, какие ошибки генерируются, если они есть в менеджерах очереди AMQERR01.LOG? Как насчет локального клиента AMQERR01.LOG?
Вы ответили с ошибкой диспетчера очереди:
AMQ9660: SSL key repository: password stash file absent or unusable.
И вы нашли ошибку за каждое обновление:
UPDATE: Я обнаружил, что ошибка связана с неправильным доступом к базе данных ключей. Я упомянул путь до имени папки, где были размещены сертификаты. Однако, как ожидается, это имя папки, за которой следует имя файла kdb без расширения.
Теперь вы перешли к следующей ошибке:
The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel…
Я посоветовал: Управляемый.net не использует указанный вами шифр, он выбран из политики Windows. Этот вопрос и ответ должны помочь ” IBM MQ.Net CertificateLabel, CipherSpec “.
Вы сообщили, что исправили групповую политику, а затем перешли к следующей ошибке при установке SSLCAUTH(REQUIRED) на канале SVRCONN:
channel is lacking a certificate
SSLCAUTH(REQUIRED) сообщает менеджеру очереди, что вы SSLCAUTH(REQUIRED), чтобы клиент имел сертификат. Клиент всегда будет требовать, чтобы диспетчер очереди имел сертификат независимо от того, для чего SSLCAUTH.
Предполагая, что диспетчер очереди настроен на выполнение CONNAUTH для проверки пользователя и пароля, которые вы отправляете, и вы установили ADOPTCTX(YES) в CONNAUTH AUTHINFO, тогда наличие SSLCAUTH(OPTIONAL) является разумной настройкой, так как это означает, что все данные между клиент и диспетчер очереди будут зашифрованы, а соединение будет аутентифицировано id/pw. Даже если у вас есть SSLCAUTH(REQUIRED), если вы также настроить SVRCONN в соответствии с конкретным DN значение либо через канал SSLPEER собственности или CHLAUTH TYPE(SSLPEERMAP) правило SSLPEER собственности оно не предоставляет какой – либо форме аутентификации.