Как сделать Indy OpenSSL совместимым с большинством серверов

я использую следующий код для настройки SSLHandler для POP3 / SMTP отправки / получения приложения:

IdSSLHandler->SSLOptions->Mode        = sslmClient;
IdSSLHandler->SSLOptions->Method      = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;

таким образом, вышеуказанный код должен поддерживать SSL 3, TLS 1, TLS 1.1 и TLS 1.2 автоматически. Это не работает хорошо и сообщает об ошибке "неправильная версия". Когда SSLVersions строка удаляется, тогда она работает, но по умолчанию она включает sslvSSLv2 который я не хочу поддерживать. Это то же самое, что:

IdSSLHandler->SSLOptions->Mode        = sslmClient;
IdSSLHandler->SSLOptions->Method      = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv2 << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;

по какой-то причине это работает и выше не на том же сервер. Я знаю это slvSSLv23 вид "использовать любую доступную версию" значение. Так почему же он не работает с вышеуказанным кодом, где Версия 2 отсутствует?

кроме того, я могу использовать TSL1, который, кажется, широко развернут, но если сервер поддерживает 1.1 или 1.2, то мой код не будет использовать более поздние версии, но заставит версию 1.0, если не используется что-то вроде выше.

Я хотел бы сделать инициализацию следующим голы:

  • совместим со всеми серверами, независимо от того, используют ли они v3, tls1, tls1.1 или tls1.2
  • автоматически использовать самую последнюю версию и использовать более низкую версию, если более последняя не доступна на сервере, но не ниже версии 3-сбой / исключение, если версия ниже 3

Я думал, что первая версия кода обеспечит это, но она сообщает об ошибке версии. Возможны ли вышеуказанные цели или пользовательская настройка должна быть предоставлена выберите версию SSL для использования?

1 ответов


задание SSLVersions для одного значения автоматически устанавливает Method к соответствуя одиночной версии. Установка SSLVersions для нескольких значений автоматически устанавливает Method to slvSSLv23.

задание Method в одной версии автоматически устанавливает SSLVersions к соответствующему одиночному значению. Установка Method to slvSSLv23 автоматически определяет SSLVersions для всех поддерживаемых значений.

Indy активирует / деактивирует соответствующий SSL_OP_NO_SSL_v# и SSL_OP_NO_TLS_v# флаги в OpenSSL в зависимости от значений Method и SSLVersions.

я бы предложил следующий подход, который является немного более будущим доказательством при добавлении новых версий TLS:

IdSSLHandler->SSLOptions->Method      = sslvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = IdSSLHandler->SSLOptions->SSLVersions >> sslvSSLv2;

в любом случае, Indy будет использовать SSLv23 только с SSL_OP_NO_SSL_v2 флаг.

в этой конфигурации ошибка "неправильная версия" обычно означает, что сервер использует определенную версию, которая не поддерживает согласование версий (которая использует SSLv2-совместимый клиент Здравствуйте). Другими словами, клиент SSLv23, подключающийся к серверу TLSv1, завершится ошибкой. Сервер должен использовать SSLv23 для поддержки согласования версий. Использование SSLv23 на сервере позволяет ему принимать любой клиент версии, поскольку клиент инициирует рукопожатие, чтобы сервер мог видеть, какой заголовок версии используется. Но использование SSLv23 на клиенте не позволяет ему подключаться к любому серверу, кроме сервера SSLv23. Сервер SSLv2 может принимать только клиенты SSLv2, Сервер по протоколу SSLv3 может только принимать клиентов, протокол SSLv3, TLSv1 защита сервер может только принимать протоколе TLSv1, приводящая к клиентам, и так далее.

чтобы действительно подключиться к" любому "серверу, вам нужно будет обнаружить ошибку "неправильной версии" и повторить попытку с другим конкретным Method/SSLVersions конфигурации. К сожалению, ответ "неправильная версия" не включает фактическую версию сервера, поэтому вы должны использовать пробную версию и ошибку. Если SSLv23 не удается, попробуйте TLSv1_2. Если это не удается, попробуйте TLSv1_1. Если это не удается, попробуйте TLSv1. Если это не удается, попробуйте SSLv3.