Я использую Microsoft Crypto API для обработки соединений SSL. При общении с серверами, которые поддерживают TLS 1.0 или выше, все работает нормально, но когда я пытаюсь иметь дело с сервером, который поддерживает только SSL 3.0 InitializeSecurityContext()
ошибка с кодом ошибки 0x80090331 (SEC_E_ALGORITHM_MISMATCH
).
Я пытался играть с SCHANNEL_CRED
структура, которая передается AcquireCredentialsHandle()
как pAuthData
аргумент. Особенно это поле grbitEnabledProtocols
это должно контролировать набор поддерживаемых протоколов. Когда я установил grbitEnabledProtocols=SP_PROT_SSL3
все работает нормально, но это нарушает безопасность, потому что я тоже хочу поддерживать TLS 1.0, 1.1 и 1.2, и становится невозможным общаться с серверами, для которых SSL 3.0 отключен по соображениям безопасности.
Итак, проблема в том, что:
Когда я установил grbitEnabledProtocols=SP_PROT_SSL3TLS1_X
и попытайтесь установить связь с сервером, который поддерживает только SSL 3.0, подключение начинается как TLS 1.2, затем сервер отвечает заголовком SSL 3.0 и соответствующими данными. Отсюда, согласно RFC, Crypto API должен продолжить процедуру квитирования, используя протокол SSL 3.0, но вместо этого он завершается с ошибкой 0x80090331
(SEC_E_ALGORITHM_MISMATCH
клиент и сервер не могут общаться, потому что у них нет общего алгоритма).
Есть ли возможный способ включить TLS 1.0, 1.1, 1.2 вместе с SSL 3.0 в MS Crypto API?
две вещи, которые вы можете сделать как часть отладки.
1> проверьте, есть ли способ указать поддерживаемые протоколы в используемых вами API.
2> попробуйте включить все возможные алгоритмы шифрования и хэширования.
эти две опции доступны в открытом SSL.
лучший способ отладки — использовать wireshark и посмотреть, что именно отправляет код ошибки по протоколу SSL.
Других решений пока нет …