Delphi 6 и Indy SSL соединение не работает - PullRequest
1 голос
/ 14 сентября 2009

Мне нужно использовать веб-сервис через 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, и она работает. Есть ли что-то еще, что мне нужно настроить / добавить?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2009

Тот факт, что вы используете 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.

2 голосов
/ 17 сентября 2009

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

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

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

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

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

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

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

...