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

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

Но это не помогло.

Исключение - «Ошибка соединения с SSL. Ошибка: 14094410: подпрограммы SSL: SSL3_READ_BYTES: сбой подтверждения подтверждения sslv3»

Или непонятные процедуры SSL: SSL3_GET_RECORD: неправильный номер версии. Но я не могу точно решить SSL3_READ_BYTES: sslv3 alert

Пример кода, который воспроизводит проблему и примеры веб-сайтов:

begin
  httpSender := TIdHTTP.Create(nil);
   SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  SSL.SSLOptions.Method := sslvTLSv1; //or  sslvSSLv3, sslvTLSv1,sslvTLSv1_1

  //or
  //SSL.SSLOptions.Method := sslvSSLv23;
  //SSL.SSLOptions.SSLVersions :=  [sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];

  httpSender.IOHandler := SSL;
  //exceptions here
  httpSender.Get('https://www.linux.org/');
  //httpSender.Get('https://st.deviantart.net/');
  //httpSender.Get('https://c.tcdn.co/fa4/aa2/fa4aa23e-f55b-11e6-ba87-040157cdaf01/channel256.png');
end;

Итак, как мне настроить TIdHTTP для подключения к этим веб-сайтам?

Я использую Delphi XE8 и openssl 1.0.1e

1
Dmitrii Nechepurenko 5 Окт 2018 в 14:06

1 ответ

Лучший ответ

Ни одному из сайтов, о которых идет речь, не требуется более низкая версия протокола TLS. Все они прекрасно могут взаимодействовать с TLS 1.2, а иногда даже с TLS 1.3. Но все эти сайты работают только в том случае, если клиент использует расширение SNI TLS для объявления имени целевого хоста в рамках рукопожатия TLS.

Таким образом, более вероятно, что проблема на самом деле заключается в отсутствии расширения SNI. Кажется, это известная проблема. См. TIdHTTP и TLS SNI не работает для получения дополнительной информации и способов решения проблема.

1
Steffen Ullrich 5 Окт 2018 в 12:30