Я использую Microsoft Crypto API для обработки SSL-соединений. При общении с серверами, поддерживающими TLS 1.0 или выше, все работает нормально, но когда я пытаюсь иметь дело с сервером, который поддерживает только SSL 3.0 InitializeSecurityContext()
с кодом ошибки 0x80090331 (SEC_E_ALGORITHM_MISMATCH
).Резервный механизм протокола протокола SSL/TLS
Я попытался сыграть с 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> Я попытался указать протоколы, и это подробно описано в вопросе. Вы читали часть включенных grbitEnabledProtocols? Это место, где нужно указывать поддерживаемые протоколы. 2> Я включил все протоколы и шифры, но это не сработало. Я обнаружил, что OpenSSL имеет ту же проблему, по крайней мере, есть поток с тем же вопросом: http://openssl.6102.n7.nabble.com/Need-inputs-suggestions-on-SSL-TLS-protocol-version -fallback-механизм-td25597.html –