SocketTlsCertificate

Retourne les données sur le certificat utilisé pour une connexion sécurisée au réseau

int  SocketTlsCertificate(
   int           socket,               // socket
   string&       subject,              // propriétaire du certificat
   string&       issuer,               // émetteur du certificat
   string&       serial              // numéro de série du certificat
   string&       thumbprint,           // print du certificat
   datetime&     expiration            // expiration du certificat
   );

Parameters

socket

[in]  Handle de la socket retournée par la fonction SocketCreate. Lorsqu'un handle incorrect est passé, l'erreur 5270 (ERR_NETSOCKET_INVALIDHANDLE) est écrite dans _LastError.

subject

[in]  Nom du propriétaire du certificat. Correspond au champ Sujet.

issuer

[in]  Nom de l'émetteur du certificat. Correspond au champ Emetteur.

serial

[in]  Numéro de série du certificat. Correspond au champ SerialNumber.

thumbprint

[in]  Print du certificat. Correspond au numéro de hachage SHA-1 du fichier du certificat entier (tous les champs incluant la signature de l'émetteur).

expiration

[in]  Date d'expiration du certificat au format datetime.

Valeur de Retour

Retourne true en cas de succès, sinon false.

Note

Les données du certificat ne peuvent être obtenues qu'après avoir établi une connexion sécurisée avec SocketTlsHandshake.

En cas d'erreur d'obtention d'un certificat, l'erreur 5275 (ERR_NETSOCKET_NO_CERTIFICATE) est écrite dans _LastError.

La fonction ne peut être appelée que depuis les Expert Advisors et les scripts, puisqu'ils sont exécutés dans leurs propres threads d'exécution. Si appelé depuis un indicateur, GetLastError() retourne l'erreur 4014 — "Function is not allowed for call".

Exemple :

//+------------------------------------------------------------------+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2000-2024, MetaQuotes Ltd."
#property link        "https://www.mql5.com"
#property version     "1.00"
#property description "Ajoute une adresse à la liste des adresses autorisées dans les paramètres du terminal pour faire fonctionner l'exemple"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Envoi une commande au serveur                                    |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- si la connexion TLS sécurisée est utilisée via le port 443
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- si la connexion TCP standard est utilisée
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Lit la réponse du serveur                                        |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- lit les données des sockets tant qu'il y en a et juqu'au timeout
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         //--- différentes commandes de lecture suivant que la connexion est sécurisée ou pas
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         //--- analyse la réponse
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- n'affiche que l'en-tete de la réponse
            int header_end=StringFind(result,"\r\n\r\n");
            if(header_end>0)
              {
               Print("En-tete de la réponse HTTP reçue :");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- vérifie le handle
   if(socket!=INVALID_HANDLE)
     {
      //--- connexion si tout est ok
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Connexion établie avec ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- si la connexion est sécurisée par un certificat, affiche ses données
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("Certificat TLS :");
            Print("   Propriétaire :  ",subject);
            Print("   Emetteur :  ",issuer);
            Print("   Numéro :     ",serial);
            Print("   Print : ",thumbprint);
            Print("   Expiration : ",expiration);
            ExtTLS=true;
           }
         //--- envoi une requete GET au serveur
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n"))
           {
            Print("Requête GET envoyée");
            //--- lit la réponse
            if(!HTTPRecv(socket,1000))
               Print("Echec d'obtention d'une réponse, erreur ",GetLastError());
           }
         else
            Print("Echec d'envoi de la requete GET, erreur ",GetLastError());
        }
      else
        {
         Print("Connexion à ",Address,":",Port," échouée, erreur ",GetLastError());
        }
      //--- ferme la socket après son utilisation
      SocketClose(socket);
     }
   else
      Print("Echec de création de la socket, erreur ",GetLastError());
  }
//+------------------------------------------------------------------+