SSL-соединение Delphi 6 и Indy не работает

Мне нужно использовать веб-службу через SSL. Для этого я создал веб-клиент на Delphi 6, который использует Indy для чтения клиентских сертификатов и записи мыльного запроса через https. Скомпилированная версия кода представляет собой DLL, работающую в IIS 5.0. После тестирования кода на моем локальном компьютере он работает нормально (я за прокси). Но после того, как код развернут на prod-серверах (не прокси), SSL-соединение не работает с сообщением «Ошибка соединения с SSL».

Вот мой код:

var
  Response: TStringStream;
  IdHttp: TIdHTTP;
  IdCnxSLL: TIdConnectionInterceptOpenSSL;
  XmlSoapDoc: IXMLDocument;
begin
  Response := TStringStream.Create('');
  IdHttp := TIdHTTP.Create(nil);
  IdCnxSLL := TIdConnectionInterceptOpenSSL.Create(nil);
  XmlSoapDoc := TXMLDocument.Create(nil);
  with IdCnxSLL do
   begin
    IdCnxSLL.SSLOptions.Method := sslvSSLv23;
    IdCnxSLL.SSLOptions.RootCertFile := IniHttpConnectionData.Values['RootCertFile'];
    IdCnxSLL.SSLOptions.CertFile := IniHttpConnectionData.Values['CertFile'];
    IdCnxSLL.SSLOptions.KeyFile := IniHttpConnectionData.Values['KeyFile'];
    IdCnxSLL.OnGetPassword :=  IdConInterceptOpenSSLGetPassword;
  end;
  with IdHttp do
  begin
    if bUseProxy then
    begin
       Request.ProxyServer := IniHttpConnectionData.Values['ProxyServer'];
       Request.ProxyPort := StrToIntDef(IniHttpConnectionData.Values['ProxyPort'], 0);
    end
    else
    begin
       Host := IniHttpConnectionData.Values['HTTPHost'];
       Port := StrToIntDef(IniHttpConnectionData.Values['HTTPPort'], 443);
    end;
    Request.ContentType := 'text/xml';
    Intercept := IdCnxSLL;
    InterceptEnabled := True;
  end;

  try
    IdHttp.Post(ServiceURL, SoapEnv, Response);
  except
    on E:EIdOSSLConnectError do
       LogError('SSL Connect Error: ' + E.Message);
    on E:Exception do
      LogError('Error' + E.ClassName + ' - ' + E.Message);
  end;

Я также пытаюсь скомпилировать этот код в exe-программу, и она работает. Есть ли что-то еще, что мне нужно настроить / добавить?

Спасибо.


person tecnotalk    schedule 14.09.2009    source источник


Ответы (2)


Тот факт, что вы используете TIdConnectionInterceptOpenSSL, говорит мне, что вы используете ОЧЕНЬ старую версию Indy. Я предполагаю, что Indy 8 поставлялся с D6. Indy 8 и более ранние версии больше не поддерживаются официально командой разработчиков Indy (членом которой я являюсь). Вам действительно стоит перейти на Indy 9, если не на Indy 10. В Indy 9 TIdConnectionInterceptOpenSSL был заменен новым компонентом TIdSSLIOHandlerSocket. Кроме того, для Indy 9 и более ранних версий требовались специальные библиотеки DLL OpenSSL, которые также могут способствовать возникновению вашей ошибки, если вы используете неправильные библиотеки DLL для своей версии Indy. Indy 10, с другой стороны, теперь использует стандартные библиотеки DLL с веб-сайта OpenSSL.

person Remy Lebeau    schedule 15.09.2009
comment
Вы правы, я работаю над D6 / Indy 8. Я не могу обновиться до indy 9 или 10, так как есть некоторые существующие приложения, которые используют эту версию Delphi и Indy. Для будущих новых разработок я обязательно перейду на Indy 10. Спасибо за ваш ответ. - person tecnotalk; 17.09.2009

На самом деле это сработало. Хотя я настоятельно рекомендую вам использовать более новую версию Indy, как предлагает Реми. Я опубликую шаги, которые помогли мне решить, поскольку должны быть другие люди с такой же проблемой.

Исходный код, который я опубликовал, работает, он работает, когда нам нужно публиковать информацию через защищенный http (https), но удаленный сервер требует предварительной аутентификации с использованием сертификата клиента.

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

  1. Конфигурация TIdHttp и TIdConnectionInterceptOpenSSL
  2. Сертификаты

Для первых 2 шагов выполните шаги, указанные здесь текст ссылки или (если срок действия ссылки истек) Google "IndySSL - с использованием аутентификации сертификата". У меня это сработало.

  1. Indy SSL DLL. (Для D6 / Indy 8 загрузите indy_openssl096g.zip со страницы Indy SSL или Intelicom) Это библиотеки DLL, единственные из которых работали для этой версии Инди.

Надеюсь, это поможет.

person tecnotalk    schedule 17.09.2009
comment
Помог мне. Спасибо. - person user30478; 08.05.2018