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 :

[D10.3] Erreur EIdOSSLUnderlyingCryptoError avec TIdHTTP


Sujet :

Web & réseau Delphi

  1. #1
    Expert confirmé
    [D10.3] Erreur EIdOSSLUnderlyingCryptoError avec TIdHTTP
    J'ai une unité écrite sous D2007 (pour un projet D2007) utilisant TIdHTTP pour attaquer un webservice.
    Sous D2007, tout fonctionne bien.

    La même unité utilisée depuis un projet D10.3, me donne l'erreur suivante à chaque appel de IdHTTP.DoRequest():
    Code = 404 - [EIdOSSLUnderlyingCryptoError] Erreur lors de la connexion avec SSL.
    error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
    Je ne comprend pas pourquoi ça ne peut pas marcher aussi bien que sous D2007, et je ne trouve rien de clair avec google.
    Quelqu'un saurait à quoi correspond exactement le pb, et ce qui ne va pas ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. Écrivez dans un français correct !!

    Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  2. #2
    Expert éminent sénior
    Salut,

    tu as un problème de version de TLS/SSL, mais c'est pas déjà avec toi que j'ai parlé de cela ?

    idHTTP ne sait pas faire du HTTPS sans un IOHandler, celui de OpenSSL ou celui de SChannel
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert confirmé
    Citation Envoyé par Paul TOTH Voir le message
    c'est pas déjà avec toi que j'ai parlé de cela ?
    Peut-être, me souviens pas ..

    Citation Envoyé par Paul TOTH Voir le message
    idHTTP ne sait pas faire du HTTPS sans un IOHandler
    Ca, je savais déjà. J'ai sûrement (presque) fait tout ce qu'il faut, puisque tout marche parfaitement bien sous D2007.
    Qu'est ce qu'ils ont encore inventé sous D10.3, pour ça ne marche pas ...

    Et j'ai essayé tout plein de combinaisons de valeurs pour IdIoHandler.SSLOptions.Method et IdIoHandler.SSLOptions.SSLVersions, mais sans succès ...
    [EIdOSSLUnderlyingCryptoError] Erreur lors de la connexion avec SSL.
    error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
    Parfois une variante :
    [EIdOSSLUnderlyingCryptoError] Erreur lors de la connexion avec SSL.
    error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    type
       TMonIdHTTP = class(TIdHTTP);
    ...
     
    var
      IdHTTP: TMonIdHTTP;
      IdIoHandler: TIdSSLIOHandlerSocketOpenSSL;
      Question, Reponse: TStringStream;
      i: Integer;
    begin
      IdIoHandler := nil;
      IdHTTP := TMonIdHTTP.Create(nil);
      Question := TStringStream.Create(sCorps);
      Reponse := TStringStream.Create('');
      try
        IdHTTP.ConnectTimeout := nTimeOutConnexion;
        IdHTTP.ReadTimeout := nTimeOutLecture;
        IdHTTP.Request.ContentType := 'application/json';
        IdHttp.Request.ContentEncoding := 'utf-8';
        IdHTTP.Request.CustomHeaders.FoldLines := False;
    //    IdHTTP.HTTPOptions := [hoNoProtocolErrorException];
        if Assigned(EnTetes) then
        begin
          for i:=0 to Pred(EnTetes.Count) do
            IdHTTP.Request.CustomHeaders.AddValue(EnTetes.Names[i], EnTetes.ValueFromIndex[i]);
        end;
        if LowerCase(Copy(sURL, 1, 5)) = 'https' then
        begin
          IdIoHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
          IdIoHandler.Destination := TIDURI.URLEncode(sURL);
          IdIoHandler.SSLOptions.Method := sslvSSLv23;                                                                                   // <------- Ici, j'ai essayé toutes les valeurs.
          IdIoHandler.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];         // <------- Ici, j'ai essayé plein de combinaisons.
          IdHTTP.IOHandler := IdIoHandler;
        end;
     
        // Appel web-service.
        try
          IdHTTP.DoRequest(sMethode, TIDURI.URLEncode(sURL), Question, Reponse, []);        // <------ Ici l'erreur.
          Result := IdHTTP.ResponseCode;
          {$IF CompilerVersion > 18.5}
            sReponseJSon := UTF8ToString(RawByteString(Reponse.DataString));
          {$ELSE}
            sReponseJSon := UTF8Decode(Reponse.DataString);
          {$IFEND}
        except
          on E: EIdHTTPProtocolException do
          begin
            Result := E.ErrorCode;
            {$IF CompilerVersion > 18.5}
              sReponseJSon := UTF8ToString(RawByteString(E.ErrorMessage));
            {$ELSE}
              sReponseJSon := UTF8Decode(E.ErrorMessage);
            {$IFEND}
          end;
     
          on E: Exception do
          begin
            Result := 404;
            sReponseJSon := '[' + E.className + ']  ' + E.Message;
          end;
        end;
      finally
        Question.Free;
        Reponse.Free;
        if Assigned(IdIoHandler) then
          IdIoHandler.Free;
        IdHTTP.Free;
      end;


    Et comme il n'y a plus d'aide fournie avec Indy, à part ce site officiel (https://github.com/IndySockets/Indy/issues/125) qui est loin d'être d'une grande aide ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. Écrivez dans un français correct !!

    Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  4. #4
    Expert confirmé
    J'ai testé ce matin le Post(), mais même résultat :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    IdHTTP.Post(TIDURI.URLEncode(sURL), Question, Reponse);

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. Écrivez dans un français correct !!

    Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  5. #5
    Rédacteur/Modérateur

    Bonjour,

    Tu n'aurais pas un problème de bibliothèque ssl tout simplement ? As-tu vérifié la version utilisée ?
    Une copie dans le répertoire d'exécution pour en être sûr pourrait être un bon test, pour peu que, dans le répertoire système ce ne soit pas une version "compatible"
    Version différente de Indy implique peut-être version différente de SSL surtout une version ante Unicode versus Unicode

    Citation Envoyé par Open SSL
    April 21, 2020 - All users and applications should be using the OpenSSL 1.1.1 (LTS) series at this point. 1.0.2 (LTS) series is only being made available for a little longer. 1.1.0 series is completely out of support.
    Pour info le docwiki de Rio pointe sur le chargement de la 1.0.2
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Expert confirmé
    J'ai testé un projet de test d'un collègue (en D10.3) qui me donnait la même erreur.
    Donc, le pb venait de mon poste.
    On m'a parlé de DLL.
    J'ai fait une recherche, et j'ai une cinquantaine d'exemplaires de libeay32.dll et ssleay32.dll sur mon poste.
    Apparemment, chaque application possède au moins un exemplaire de ces DLL (voire plusieurs). Les applications et modules Microsoft font pareil (je suppose que c'est la bonne façon de faire, avec ces DLL).

    J'en ai copié au hasard dans mon répertoire, et ça s'est mis à marcher en D10.3, à condition d'utiliser la fonction Post() et non DoRequest()
    J'ai rajouté des if de compilation pour ne pas perturber ce qui marche sous D2007.

    Citation Envoyé par SergioMaster Voir le message
    Tu n'aurais pas un problème de bibliothèque ssl tout simplement ? As-tu vérifié la version utilisée ?
    Tu parles de la version des fichiers DLL ?
    Ceux que j'ai collé ont la version 1.0.1.3

    Citation Envoyé par SergioMaster Voir le message
    dans le répertoire système ce ne soit pas une version "compatible"
    Il n'y en a pas dans des répertoires du genre \system 32\
    Je suppose que c'est parce que chaque exe utilise les siennes.

    Citation Envoyé par SergioMaster Voir le message
    surtout une version ante Unicode versus Unicode
    Effectivement.



    Apparemment, ça a l'air de marcher comme ça.
    de vous être penchés sur mon pb.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. Écrivez dans un français correct !!

    Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  7. #7
    Rédacteur/Modérateur

    Citation Envoyé par Lung Voir le message

    Il n'y en a pas dans des répertoires du genre \system 32\
    Oui mais, pour peu que ce soit un système 64 bits, il faudrait aussi vérifier dans SYSWOW64
    Tu parles de la version des fichiers DLL ?
    Ceux que j'ai collé ont la version 1.0.1.3
    Comme j'ai indiqué, pour Rio ce serait la 1.0.2 la plus indiquée
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Expert éminent sénior
    Citation Envoyé par Lung Voir le message
    ...

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
          IdIoHandler.SSLOptions.Method := sslvSSLv23;                                                                                   // <------- Ici, j'ai essayé toutes les valeurs.
          IdIoHandler.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];         // <------- Ici, j'ai essayé plein de combinaisons.


    ...
    SSL c'est l'ancêtre de TLS et c'est complètement déprécié
    TLS v1 est déprécié
    TLS V1.1 aussi
    en fait tu devrais tuiliser TLSv1_2 ou plus récent (si ou quand dispo)

    la seule raison de venir sur des versions plus anciennes serait que le serveur ne soit pas à jour

    ensuite il faut que la DLL soit dans une version qui supporte cette version évidemment. le support TLS 1.2 est apparu dans OpenSSL 1.0.1, tout version plus ancienne échouera donc forcément...mais il est recommandé d'utiliser la dernière version donc 1.1.1 à priori...sur mon poste j'ai du 1.0.2.11...mais en fait de plus en plus je passe par SChannel car cela m'évite d'avoir à diffuser OpenSSL.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store