SocketTlsCertificate

Obtiene los datos sobre el certificado usado para proteger la conexión de red.

int  SocketTlsCertificate(
   int           socket,               // socket
   string&       subject,              // propietario del certificado
   string&       issuer,               // emisor del certificado
   string&       serial              // número de serie del certificado
   string&       thumbprint,           // huella digital del certificado
   datetime&     expiration            // plazo de expiración del certificado
   );

Parámetros

socket

[in]  Manejador del socket retornado por la función SocketCreate. Al transmitir un manejador incorrecto, en _LastError se registra el error 5270 (ERR_NETSOCKET_INVALIDHANDLE).

subject

[in]  Nombre del propietario del certificado. Se corresponde con el campo Subject.

issuer

[in]  Nombre del emisor del certificado. Se corresponde con el campo Issuer.

serial

[in]  Número de serie del certificado. Se corresponde con el campo SerialNumber.

thumbprint

[in]  Huella digital del certificado. Se corresponde con el hash SHA-1 del archivo del certificado completo (todos los campos, incluyendo la firma del emisor).

expiration

[in]  Plazo de expiración del certificado, en el formato datetime.

Valor retornado

Retorna true en caso de éxito, de lo contrario, false.

Observación

La solicitud de datos del certificado es posible solo después de establecer una conexión protegida con la ayuda de SocketTlsHandshake.

Si se da un error de obtención del certificado, en _LastError se registrará el error 5275 (ERR_NETSOCKET_NO_CERTIFICATE).

Solo se puede llamar la función desde los expertos y scripts, puesto que funcionan en su propio flujo de ejecución. Si se llama desde el indicador, GetLastError() retornará el error 4014 — "La función de sistema no está permitida para la llamada".

Ejemplo:

//+------------------------------------------------------------------+
//|                                                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 "Para que el ejemplo funcione, añada Address a la lista de permitidas en los ajustes del terminal"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Enviando comandos al servidor                                    |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- si se usa una conexión TLS protegida a través del puerto 443
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- si se usa una conexión TCP normal
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Leyendo la respuesta del servidor                                |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- leemos los datos del socket mientras haya, pero no por un tiempo superior a timeout
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         //--- diferentes comandos de lectura, dependiendo de si la conexión está o no protegida
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         //--- analizamos la respuesta
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- imprimimos solo el encabezado de la respuesta
            int header_end=StringFind(result,"\r\n\r\n");
            if(header_end>0)
              {
               Print("Obtenido el encabezado HTTP de la respuesta:");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- comprobando el manejador
   if(socket!=INVALID_HANDLE)
     {
      //--- si todo está en orden, nos conectamos
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Conexión establecida con ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- si la conexión está protegida con un certificado, mostramos sus datos
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("Certificado TLS:");
            Print("   Propietario:  ",subject);
            Print("   Emisor:  ",issuer);
            Print("   Número:     ",serial);
            Print("   Huella digital: ",thumbprint);
            Print("   Expiración: ",expiration);
            ExtTLS=true;
           }
         //--- enviamos al servidor una solicitud GET
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
           {
            Print("Solicitud GET enviada");
            //--- leemos la respuesta
            if(!HTTPRecv(socket,1000))
               Print("No se ha podido obtener la respuesta, error ",GetLastError());
           }
         else
            Print("No se ha logrado enviar la solicitud GET, error ",GetLastError());
        }
      else
        {
         Print("No se ha logrado conectar con ",Address,":",Port," error ",GetLastError());
        }
      //--- cerramos el socket después de usarlo
      SocketClose(socket);
     }
   else
      Print("No se ha logrado crear el socket, error ",GetLastError());
  }
//+------------------------------------------------------------------+