2009-09-14 9 views
1

Je dois consommer un service Web via SSL. Pour ce faire, j'ai construit un client Web dans Delphi 6 qui utilise Indy pour lire les certificats clients et écrire la demande de savon via https. La version compilée du code est une DLL qui s'exécute dans IIS 5.0. Après avoir testé le code dans ma machine locale, cela fonctionne bien (je suis derrière un proxy). Mais après que le code est déployé pour prod serveurs (pas proxy) la connexion SSL échoue en disant "Erreur de connexion avec SSL".La connexion Delphi 6 et Indy SSL ne fonctionne pas

Voici mon code:

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; 

J'essaie aussi de ce code compilation dans un programme exe et il fonctionne. Y at-il quelque chose d'autre que j'ai besoin de configurer/ajouter?

Merci.

Répondre

1

Finnally Ça a marché. Bien que je vous encourage fortement à utiliser une version plus récente d'Indy comme le suggère Remy. Je vais poster les étapes qui ont fait le tour pour moi car il devrait y avoir d'autres personnes avec le même problème.

Le code d'origine que j'ai posté est fonctionnel, il fonctionne lorsque nous devons publier des informations via http (https) sécurisé, mais le serveur distant nécessite une authentification préalable en utilisant un certificat client.

Pour le faire fonctionner, il est nécessaire de vérifier les points suivants:

  1. configuration TIdHttp et TIdConnectionInterceptOpenSSL
  2. Certificats

Pour les 2 premières étapes suivez les étapes mentionnées ici link text ou (en cas de lien est expiré) Google "IndySSL - en utilisant l'authentification par certificat". Cela a fonctionné pour moi.

  1. Indy SSL DLLs. (Pour D6/Indy 8 télécharger indy_openssl096g.zip à partir de Indy SSL ou Intelicom) Cette DLL où les seuls qui ont travaillé pour cette version d'Indy.

Espérons que cela aidera.

2

Le fait que vous utilisiez TIdConnectionInterceptOpenSSL me dit que vous utilisez une ancienne version de VERY d'Indy. Je devine Indy 8, qui a expédié avec D6. Indy 8 et plus ne sont plus officiellement supportés par l'équipe de développement d'Indy (dont je suis membre). Vous devriez vraiment passer à Indy 9, sinon à Indy 10. Dans Indy 9, TIdConnectionInterceptOpenSSL a été remplacé par un nouveau composant TIdSSLIOHandlerSocket. De plus, Indy 9 et les versions antérieures nécessitaient des DLL OpenSSL personnalisées, ce qui peut contribuer à votre erreur si vous utilisez les mauvaises DLL pour votre version d'Indy. D'un autre côté, Indy 10 utilise les DLL standard du site Web d'OpenSSL.

+0

Vous avez raison, je travaille sur D6/Indy 8. Je ne peux pas mettre à jour pour indy 9 ou 10, car il existe des applications existantes qui utilise cette version de Delphi et Indy. Pour les futurs développements je vais certainement passer à Indy 10. Merci pour votre réponse. – tecnotalk

Questions connexes