Протокол TIdSSLIOHandlerSocketOpenSSL и TLS - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть настольное приложение Windows, разработанное в XE2, которое извлекает данные с удаленного сервера в формате JSON.Я использую Indy 10 для управления этим.

Приложение работало нормально, пока я не получил письмо от провайдера сервера:

"... единственный протокол для защиты связибудет TLS 1.2. Старые версии (TLS.1.0, TLS.1.1 или SSLv3) больше не будут работать. " Они советуют использовать TLS 1.2 или выше.

С тех пор у меня возникает следующая ошибка времени выполнения

Исключение из первого шанса при $ 7518845D.Класс исключения EIdOSSLUnderlyingCryptoError с сообщением «Ошибка соединения с SSL.Ошибка подключения по SSL.ошибка: 1408F10B: подпрограммы SSL: SSL3_GET_RECORD: неправильный номер версии '.

Я обнаружил, что ошибка вызывается, когда я вызываю FidHTTP.Post (FidHTTP является экземпляром TidHTTP).

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

constructor TMyClass.Create;

begin
  FidHTTP := TidHTTP.Create(nil);
  FidHTTP.HTTPOptions := FidHTTP.HTTPOptions - [hoForceEncodeParams];
  FidHTTP.Intercept := TIdLogFile.Create(FidHTTP);

  TIdLogFile(FidHTTP.Intercept).Filename := 'c:\'+s+'.log';
  TIdLogFile(FidHTTP.Intercept).Active := true;
  {$IFDEF VER230}
  FIdSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
  FIdSSL.SSLOptions.Method:=sslvTLSv1; // I have added this line
  {$ENDIF}
end;

, но теперь у меня есть другая ошибка:

Исключение первого шанса на сумму 7518845D.Класс исключения EIdSocketError с сообщением «Ошибка сокета # 10054 Сброс соединения по пиру.».

Я нашел это в Google, но нашел информацию только по FTP, что не соответствует моему случаю.

Что я делаю неправильно?Это потому, что у меня есть старая версия Indy без опции sslvTLSv1_2 или?

1 Ответ

0 голосов
/ 20 февраля 2019

sslvTLSv1 только для TLS v1.0.Чтобы использовать TLS v1.2, вам нужно использовать sslvTLSv1_2 вместо:

FIdSSL.SSLOptions.Method := sslvTLSv1_2;

или:

FIdSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];

Если ваша версия Indy не имеет sslvTLSv1_2, тогда вы будетедолжны обновить.Текущая версия Indy v10.6.2.5494.

Кроме того, убедитесь, что вы используете хотя бы OpenSSL v1.0.1, который является версией, которая впервые добавила поддержку TLS v1.2.Последняя версия OpenSSL, которую поддерживает Indy 10, v1.0.2.

Кроме того, вам необходимо удалить {$IFDEF VER230} из вашего кода.Это ограничивает ваш код созданием TIdSSLIOHandlerSocketOpenSSL только при компиляции специально для XE2.По умолчанию TIdSSLIOHandlerSocketOpenSSL включает только TLS v1.0, поэтому вам придется изменить код, чтобы всегда создавать TIdSSLIOHandlerSocketOpenSSL безоговорочно, чтобы включить TLS v1.2 независимо от используемой версии компилятора (по крайней мере, до этот билет реализован).

...