2009-09-14 2 views
1

SSL을 통해 웹 서비스를 사용해야합니다. 이를 위해 Delphi 6에서 Indy를 사용하여 클라이언트 인증서를 읽고 https를 통해 SOAP 요청을 작성하는 웹 클라이언트를 구축했습니다. 컴파일 된 버전의 코드는 IIS 5.0에서 실행되는 DLL입니다. 내 로컬 컴퓨터에서 코드를 테스트 한 후 제대로 작동합니다 (프록시 뒤에서). 그러나 코드가 프록시가 아닌 서버를 프로비저닝하기 위해 배포 된 후 SSL 연결은 "SSL 연결 오류"를 나타내지 못합니다.Delphi 6와 Indy 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 프로그램에 컴파일하고 작동 시도 :

여기 내 코드입니다. 구성/추가해야 할 다른 것이 있습니까?

감사합니다.

답변

1

Finnally 효과적입니다. Remy가 제안한대로 최신 버전의 Indy를 사용하는 것이 좋습니다. 같은 문제가있는 다른 사람들이 있어야하기 때문에 나는 트릭을 한 단계를 게시 할 것이다.

내가 게시 한 원본 코드는 작동하며 보안 HTTP (https)를 통해 정보를 게시해야하지만 원격 서버는 클라이언트 인증서를 사용하여 이전 인증을 요구할 때 작동합니다. 처음 2 단계는

  1. TIdHttp 및 TIdConnectionInterceptOpenSSL 구성
  2. 인증서

link text 여기에 언급 된 단계를 수행 : 그것이 작동되도록하기 위해서는

, 다음과 같은 확인하는 것이 필요하다 또는 (링크가 만료 된 경우) Google "IndySSL - 인증서 인증 사용". 그것은 나를 위해 일했습니다.

  1. 인디 SSL DLL. (D6/Indy 8의 경우 indy_openssl096g.zip을 Indy SSL 또는 Intelicom에서 다운로드하십시오.)이 DLL은이 버전의 Indy에서만 작동합니다.

희망이 도움이 될 것입니다.

2

TIdConnectionInterceptOpenSSL을 사용한다는 사실은 VERY 이전 버전의 Indy를 사용하고 있다는 사실을 알려줍니다. 나는 D6와 함께 선적 된 Indy 8을 추측하고 있습니다. Indy 8 및 이전 버전은 더 이상 공식적으로 Indy 개발 팀에서 지원하지 않습니다. 인디 9가 아니라면 인디 9로 업그레이드해야합니다. 인디 9에서는 TIdConnectionInterceptOpenSSL이 새로운 TIdSSLIOHandlerSocket 구성 요소로 대체되었습니다. 또한 Indy 9 이전 버전에서는 맞춤형 OpenSSL DLL이 필요했는데, 이는 Indy 버전에 잘못된 DLL을 사용하는 경우에도 오류에 기여할 수 있습니다. 반면 인디 10은 OpenSSL 웹 사이트의 표준 DLL을 사용합니다.

+0

D6/Indy 8에서 작업 중입니다.이 버전의 Delphi와 Indy를 사용하는 기존 앱이 있기 때문에 indy 9 또는 10으로 업데이트 할 수 없습니다. 앞으로의 새로운 개발을 위해 나는 확실히 Indy 10으로 전환 할 것입니다. 귀하의 회신에 감사드립니다. – tecnotalk

관련 문제