IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Connexion en SSL avec Indy


Sujet :

Web & réseau Delphi

  1. #1
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut Connexion en SSL avec Indy
    Bonjour

    J'essaie de me connecter à une boîte pop3 en utilisant les composants TIdPop3 et TIdSSLIOHandlerSocketOpenSSL et Delphi XE2 32 bits (c'est pareil avec XE10.2.2), sous Windows 10.

    Le code ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
       with IdPOP3 do
        begin
          Name      := 'POP3';
          AutoLogin := False;
          Host      := 'monhost';
          Username := 'monuser';
          Password := 'monpassword';
          Port      := 995;
          IOHandler := IdSSLIOHandlerSocketOpenSSL;
          UseTLS    := utUseImplicitTLS;
        end;
     
        with IdSSLIOHandlerSocketOpenSSL do
        begin
          Destination := 'monhost:995';
          Host        := 'monhost';
          Port        := 995;
          DefaultPort := 0;
        end;
        try
          IdPOP3.Connect;
        except
          on e : Exception do
            begin
            stb.SimpleText := e.Message;  
            abort;
            end;
        end;
    Le problème est que sur certains postes ça marche très bien, et sur d'autres on a toujours une erreur 10060, Délai de connexion dépassé.

    Sur les postes en erreur, on relève sans problème la même boîte POP3 avec Outlook, donc on se connecte bien et ça ne devrait pas être un problème de firewall ou autre blocage réseau.

    J'ai pris les DLL libeay32.dll et ssleay32.dll livrées avec Delphi et je les ai mises dans SYSWOW64 (mais c'est pareil si elles sont dans le même dossier que l'exécutable, ou si j'en prends d'autres).
    J'ai rendu ces DLL uniques, au cas où d'autres versions présentes sur le système seraient chargées automatiquement, et j'ai rebooté...

    En regardant le code de Indy, ce qui m'étonne est qu'on ne charge apparemment jamais ces DLL bien qu'il y ait une méthode pour le faire dans l'unité IdSSLOpenSSLHeaders.

    Et si j'appelle explicitement cette fonction IdSSLOpenSSLHeaders.Load, les handlers sont retournés à 0, sans que cela provoque d'erreur (alors que ça devrait il me semble), et laisse tous les points d'entrée des procédures des DLL à nil.

    Auriez-vous une suggestion ? Est-ce que ça fonctionne chez-vous ?

    Merci
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Exactement le même problème mais en IMAP4
    Sur mon poste XE2 et 10.2, cela fonctionne avec le même code bien dirty écrit à l'arrache

    Mon collègue, je lui passe l'exe compilé sur mon poste, il a une erreur 10060, c'est la couche TCP qui n'établit rien (Time Out),
    On a utilisé les DCU de débogage pour descendre dans IdWinsock2.pas
    cela échoue dans la procédure Stub_connect appelé lors du premier montage de la fonction connect de la DLL WS2_32.DLL.
    Voir MSDN de Windows Sockets 2 >Winsock Reference > Winsock Functions > Connect

    la pile d'appel étant

    Code pile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    IdWinsock2.Stub_connect(532,$18F400,16)
    IdStackWindows.TIdStackWindows.Connect(532,'xxx.xxx.xxx.xxx',993,Id_IPv4)
    IdSocketHandle.TIdSocketHandle.Connect
    IdIOHandlerStack.TIdIOHandlerStack.ConnectClient
    IdSSLOpenSSL.TIdSSLIOHandlerSocketOpenSSL.ConnectClient
    IdIOHandlerSocket.TIdIOHandlerSocket.Open
    IdSSLOpenSSL.TIdSSLIOHandlerSocketOpenSSL.Open
    IdTCPClient.TIdTCPClientCustom.Connect
    IdExplicitTLSClientServerBase.TIdExplicitTLSClient.Connect
    IdIMAP4.TIdIMAP4.Connect(True)

    le chargement de libeay32.dll et ssleay32.dll arrive après dans la suite de ConnectClient après la réussite de la connexion TCP via WS2_32 Connect
    Code pile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IdSSLOpenSSLHeaders.Load
    IdSSLOpenSSL.LoadOpenSSLLibrary
    IdSSLOpenSSL.TIdSSLContext.Create
    IdSSLOpenSSL.TIdSSLIOHandlerSocketOpenSSL.Init
    IdSSLOpenSSL.TIdSSLIOHandlerSocketOpenSSL.StartSSL
    IdSSLOpenSSL.TIdSSLIOHandlerSocketOpenSSL.ConnectClient -- !!
    IdIOHandlerSocket.TIdIOHandlerSocket.Open
    IdSSLOpenSSL.TIdSSLIOHandlerSocketOpenSSL.Open
    IdTCPClient.TIdTCPClientCustom.Connect
    IdExplicitTLSClientServerBase.TIdExplicitTLSClient.Connect
    IdIMAP4.TIdIMAP4.Connect(True)

    Erreur lors du WS2_32 Connect
    Code error : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WSAETIMEDOUT
    10060 
     
    Connection timed out.
    A connection attempt failed because the connected party did not properly respond after a period of time, or the established connection failed because the connected host has failed to respond.


    le code d'essai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    procedure TZooxxxxVCLMainForm.Button2Click(Sender: TObject);
    var i: integer;
        SearchInfo: array of TIdIMAP4SearchRec;
        MSG: TIdMessage;
        IUD: string;
    begin
      Memo1.Lines.Clear;
     
      IMAP.Host := 'outlook.office365.com';
      IMAP.Port := 993; // 995 (POP3 SSL). 143 (IMAP4). 993 (IMAP4 SSL). 
      IMAP.Username := 'xxx';
      IMAP.Password := '';
     
      SSL.Host := IMAP.Host;
      SSL.Port := IMAP.Port;
      SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
      SSL.MaxLineLength := MaxInt;
     
      IMAP.IOHandler := SSL;
      IMAP.UseTLS := utUseImplicitTLS;
     
      IMAP.Connect;
      IMAP.SelectMailBox('INBOX');
     
     
      for i := 1 to IMAP.MailBox.TotalMsgs do
      begin
        MSG := TIdMessage.Create(nil);
        try
          IMAP.GetUID(i, IUD);
          if IMAP.UIDRetrieve(IUD, MSG) then 
            Memo1.Lines.Add(MSG.From.Text);
        finally
          MSG.Free;
        end;
      end;
      IMAP.Disconnect;
    end;
    Code dfm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    object IMAP: TIdIMAP4
      IOHandler = SSL
      SASLMechanisms = <>
      MilliSecsToWaitToClearBuffer = 10
      Left = 512
      Top = 584
    end
    object SSL: TIdSSLIOHandlerSocketOpenSSL
      Destination = ':143'
      MaxLineAction = maException
      Port = 143
      DefaultPort = 0
      SSLOptions.Mode = sslmUnassigned
      SSLOptions.VerifyMode = []
      SSLOptions.VerifyDepth = 0
      Left = 576
      Top = 584
    end


    Une bonne âme pour trouver qu'est-ce que qui cloche dans la pratique alors que l'on a la théorie
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Ce qui clochait, c'est que l'administrateur réseau n'avait pas ouvert les accès, contrairement a ce qui avait été affirmé initialement.
    La connexion par Outlook était possible, mais pas par un programme Delphi.
    Donc tout va bien !
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Une bonne âme pour trouver qu'est-ce que qui cloche dans la pratique alors que l'on a la théorie
    Lorsque j'avais eut des soucis avec les connexion SSL, j'avais fini par renseigner les propriétés SSLOptions.Method / SSLVersions de l'objet TIdSSLIOHandlerSocketOpenSSL, ainsi que l'évènement OnStatusInfo.

    En l'occurence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SSL.Options.Method := sslvTLSv1_1;
    SSL.Options.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    SSL.OnStatusInfo := OnSSLStatusInfo;
    De mémoire, ça ne voulait pas fonctionner sans l'évènement OnStatusInfo (qui dans mon cas ne fait absolument rien à part enregistrer dans un log si l'application est en mode débug.

    En espérant que ça aide, sachant que pour moi c'était sur des connexions SMTP.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Comme je le disais cela bloquait sur le "connect" de la DLL "WS2_32.DLL" (la couche TCP\IP) donc bien avant même de charger les DLL SSL et de négocier une transaction sécurisée
    Pour moi, c'était un problème de FireWall puisque l'on était bloqué au niveau TCP\IP et comme pour Tintinux, l'administrateur réseau avait ouvert les IP autorisées pour une partie mais pas pour tout.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connection Closed Gracefully avec Indy 10 sur Windows server 2008
    Par NicolasSC dans le forum Web & réseau
    Réponses: 0
    Dernier message: 05/11/2010, 16h42
  2. Connexion SSL avec composants INDY
    Par Tenguryu dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/11/2009, 09h41
  3. Télécharger un fichier avec Indy et SSL
    Par [DreaMs] dans le forum Web & réseau
    Réponses: 7
    Dernier message: 15/11/2007, 14h27
  4. "reverse connection" avec Indy 10
    Par LeRoi dans le forum Delphi
    Réponses: 2
    Dernier message: 25/10/2006, 15h31
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo