SocketTlsCertificate

Abrufen der Daten eines Zertifikates, das für eine sichere Verwendung TLS-Handshake verwandt wird.

int  SocketTlsCertificate(
   int           socket,               // Socket
   string&       subject,              // Besitzer des Zertifikats
   string&       issuer,               // Aussteller des Zertifikats
   string&       serial              // Seriennummer des Zertifikats
   string&       thumbprint,           // Ausdruck des Zertifikats
   datetime&     expiration            // Ablaufdatum des Zertifikats
   );

Parameter

socket

[in]  Handle des Sockets, das von der Funktion SocketCreate erzeugt worden war. Wurde ein ungültiger Handle übergeben wird, wird der Fehler 5270 (ERR_NETSOCKET_INVALIDHANDLE) der Variablen _LastError zugewiesen.

subject

[in]  Besitzer des Zertifikats. Korrespondiert mit dem Feld subject.

issuer

[in]  Aussteller des Zertifikats. Korrespondiert mit dem Feld issuer.

serial

[in]  Seriennummer des Zertifikats. Korrespondiert mit dem Feld serial.

thumbprint

[in]  Ausdruck des Zertifikats. Korrespondiert mit dem SHA-1 Hash der ganzen Datei des Zertifikats (all Felder umfassen die Signatur des Ausstellers).

expiration

[in]  Ablaufdatum des Zertifikats im Format datetime.

Rückgabewert

Gibt true im Erfolgsfall zurück, andernfalls false.

Hinweis

Die Zertifikatsdaten können nur nach dem Aufbau einer sicheren Verbindung über SocketTlsHandshake angefordert werden.

Im Falle eines fehlerhaften Zertifikats wird der Fehler 5275 (ERR_NETSOCKET_NO_CERTIFICATE) der Variablen _LastError zugewiesen.

Die Funktion kann nur von Expert Advisors und Skripten aufgerufen werden, da sie in ihrem eigenen Ausführungsthread laufen. Wenn sie ein Indikator aufruft, wird von GetLastError() der Fehler 4014 – "Funktionsaufruf ist nicht erlaubt" ausgeworfen.

Beispiel:

//+------------------------------------------------------------------+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version     "1.00"
#property description "Fügen Sie die Adresse der Liste mit den erlaubten in der Einstellungen des Terminals hinzu, damit dieses Beispiel funktioniert"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Einen Befehl zum Server schicken                                 |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- Wenn eine sichere TLS-Verbindung über den Port 443 verwendet wird
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- Wenn eine standardmäßige TCP-Verbindung verwendet wird
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Lesen der Antwort vom Server                                     |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- Lesen der Daten vom Socket solange es welche gibt, aber nicht länger als der Timeout dauert
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         //--- Verschiedene Lesebefehle, je nach dem, ob die Verbindung eine sichere ist oder nicht
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         //--- Analysieren der Antwort
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- Ausdruck nur des Headers der Antwort
            int header_end=StringFind(result,"\r\n\r\n");
            if(header_end>0)
              {
               Print("Header der HTTP-Antwort erhalten:");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- Prüfen des Handles
   if(socket!=INVALID_HANDLE)
     {
      //--- Verbinden, wenn alles ok ist
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Verbindung hergestellt mit ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- Wenn die Verbindung mit einem Zertifikat gesichert ist, zeige dessen Daten
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("TLS Zertifikat:");
            Print("   Besitzer:  ",subject);
            Print("   Aussteller:  ",issuer);
            Print("   Seriennummer:     ",serial);
            Print("   Ausdruck: ",thumbprint);
            Print("   Ablaufdatum: ",expiration);
            ExtTLS=true;
           }
         //--- Senden einer GET-Anforderung an den Server
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
           {
            Print("GET-Anforderung gesendet");
            //--- Lesen der Antwort
            if(!HTTPRecv(socket,1000))
               Print("Fehlerhafte Antwort, Fehler ",GetLastError());
           }
         else
            Print("Fehler bei der GET-Anforderung, Fehler ",GetLastError());
        }
      else
        {
         Print("Verbindung mit ",Address,":",Port," schlug fehl, Fehler ",GetLastError());
        }
      //--- Schließen des Sockets nach dem Ende der Verwendung
      SocketClose(socket);
     }
   else
      Print("Fehler beim Erstellen des Sockets, Fehler ",GetLastError());
  }
//+------------------------------------------------------------------+