Delphi 6 и Indy SSL връзката не работят

Трябва да използвам уеб услуга чрез SSL. За да постигна това, създадох уеб клиент в Delphi 6, който използва Indy за четене на клиентските сертификати и писане на заявка за сапун чрез https. Компилираната версия на кода е DLL, която работи в IIS 5.0. След като тествах кода в моята локална машина, той работи добре (аз съм зад прокси). Но след като кодът е разгърнат на прод сървъри (не на прокси), 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 и по-стари изискваха персонализирани OpenSSL DLL файлове, което също може да допринася за вашата грешка, ако използвате грешни 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, както предлага Remy. Ще публикувам стъпките, които свършиха работа за мен, тъй като трябва да има други хора със същия проблем.

Оригиналният код, който публикувах, е функционален, работи, когато трябва да публикуваме информация чрез защитен 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