Прошу помощи. Вопрос по защищенному сокет подключению.

 

Добрый день.

Возник вопрос по защищенному сокет подключению при создании советника MQL5.

Окружение: МТ5 на Windows 11, сервер Node.js на VMware Ubuntu.

На 443 порту все подключается и работает корректно.

При попытке подключения на любой другой порт, получаю ошибку: 5274 Failed to establish secure connection (TLS Handshake).

Порты не блокируются, доступность портов проверена и на Windows и на Ubuntu. Сервер слушает нужный порт.

Так же вижу попытку соединения, обмен пакетами советника и сервера на порту 8000, что видно в результате выполнения sudo tcpdump -i any port 8000.

Сертификаты также настроены правильно, и можно подключиться с помощью openssl s_client -connect.

 

Возможно ли в МТ5 создание защищенного подключения, на порту отличном от 443?

Если да, то дайте, пожалуйста, рекомендации как решить проблемы с созданием защищенного подключения.

Возможно, нужны какие-то дополнительные настройки?

Код функции для создания защищенного подключения:


void Auth()
  {
  string  jsonAuth = "{";
        jsonAuth += "\"login\":" + login + ",";
        jsonAuth += "\"email\":\"" + Email + "\",";
        jsonAuth += "\"key\":\"" + SecretKey + "\",";
        jsonAuth += "\"platform\":\"" + "MT5" + "\"";
        jsonAuth += "}";

             string   auth = "{";
              auth += "\"event\":\"v1-login\","; 
              auth += "\"body\":" + jsonAuth;
              auth += "}"; 
   int socket = SocketCreate();
   if(socket!=INVALID_HANDLE)
     {
      if(SocketConnect(socket,Address,Port,5000))
        {
         Print("Установлено подключение к ",Address,":",Port);
         bool hand = SocketTlsHandshake(socket, Address);
         Print(hand, GetLastError());
        }
    
         string   subject,issuer,serial,thumbprint;
         datetime expiration;

      int dataSize = StringLen(auth); 
     uchar dataBuffer[];
     ArrayResize(dataBuffer, dataSize);
     for (int i = 0; i < dataSize; i++)
     {
         dataBuffer[i] = (uchar)auth[i];
     }
     SocketTlsSend(socket, dataBuffer, dataSize);
     }
 }
 

Да, в MetaTrader 5 (MT5) возможно создание защищенного подключения на порту, отличном от 443, но для этого могут потребоваться дополнительные настройки и проверка некоторых аспектов. Вот несколько рекомендаций, которые могут помочь решить вашу проблему:

  1. Проверка Сертификатов: Убедитесь, что сертификаты на сервере корректно настроены для использования порта, отличного от 443. Проверьте настройки вашего сервера Node.js, чтобы убедиться, что сертификат правильно применен для всех используемых портов.

  2. Настройки Брандмауэра и Маршрутизации: Хотя вы упомянули, что порты не блокируются, важно убедиться, что брандмауэр и любые сетевые устройства не блокируют или не перенаправляют трафик на этом порту.

  3. Конфигурация Серверной Программы: Убедитесь, что ваш сервер Node.js настроен для прослушивания на порту 8000 и поддерживает TLS на этом порту. Например, если вы используете https модуль, убедитесь, что он настроен правильно:

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('/path/to/your/private.key'),
  cert: fs.readFileSync('/path/to/your/certificate.crt')
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('hello world\n');
}).listen(8000);

Проверка TLS Конфигурации: Используйте openssl для проверки корректности сертификатов и настроек на порту 8000:

openssl s_client -connect your_server_address:8000
  • Использование Правильного Формата Данных: Убедитесь, что данные, которые вы отправляете через сокет, имеют правильный формат. Это особенно важно для JSON данных.

  • Отладка: Добавьте больше отладочной информации в ваш код, чтобы понять, где именно происходит ошибка. Например, добавьте вывод значений ошибок и промежуточных шагов:

    mql5

  • bool hand = SocketTlsHandshake(socket, Address);
    if(!hand) {
        Print("TLS Handshake failed with error: ", GetLastError());
        return;
    }
    
    1. Обновление MT5: Убедитесь, что у вас установлена последняя версия MetaTrader 5, так как в новых версиях могут быть исправлены ошибки и добавлены улучшения, связанные с сетевыми подключениями.

    Вот обновленный пример функции для создания защищенного подключения с дополнительной отладочной информацией:


    void Auth()
    {
        string jsonAuth = "{";
        jsonAuth += "\"login\":" + login + ",";
        jsonAuth += "\"email\":\"" + Email + "\",";
        jsonAuth += "\"key\":\"" + SecretKey + "\",";
        jsonAuth += "\"platform\":\"" + "MT5" + "\"";
        jsonAuth += "}";
    
        string auth = "{";
        auth += "\"event\":\"v1-login\",";
        auth += "\"body\":" + jsonAuth;
        auth += "}";
    
        int socket = SocketCreate();
        if(socket != INVALID_HANDLE)
        {
            if(SocketConnect(socket, Address, Port, 5000))
            {
                Print("Установлено подключение к ", Address, ":", Port);
                bool hand = SocketTlsHandshake(socket, Address);
                if(!hand) 
                {
                    Print("TLS Handshake failed with error: ", GetLastError());
                    return;
                }
    
                string subject, issuer, serial, thumbprint;
                datetime expiration;
    
                int dataSize = StringLen(auth);
                uchar dataBuffer[];
                ArrayResize(dataBuffer, dataSize);
                for(int i = 0; i < dataSize; i++)
                {
                    dataBuffer[i] = (uchar)auth[i];
                }
    
                if(SocketTlsSend(socket, dataBuffer, dataSize) == SOCKET_ERROR)
                {
                    Print("Error sending data: ", GetLastError());
                }
            }
            else
            {
                Print("Failed to connect to ", Address, ":", Port, " with error: ", GetLastError());
            }
        }
        else
        {
            Print("Failed to create socket with error: ", GetLastError());
        }
    }
    
     
    Спасибо за ответ. Это не понял: " Проверьте настройки вашего сервера Node.js, чтобы убедиться, что сертификат правильно применен для всех используемых портов." Никакой специальной фильтрации для сертификатов в ноде нет. Все остальное уже сделано и  проверено 10 раз, о чем я написал. Об этом: 
    openssl s_client -connect your_server_address:8000
    тоже я написал, все работает корректно.  Думаю проблема в МТ5. Надеюсь, получить помощь сообщества. Возможно кто-то сталкивался с подобной проблемой, и может подсказать решение.
     

    Может помежет

    https://www.mql5.com/en/articles/8196

    Websockets for MetaTrader 5
    Websockets for MetaTrader 5
    • www.mql5.com
    Before the introduction of the network functionality provided with the updated MQL5 API, MetaTrader programs have been limited in their ability to connect and interface with websocket based services. But of course this has all changed, in this article we will explore the implementation of a websocket library in pure MQL5. A brief description of the websocket protocol will be given along with a step by step guide on how to use the resulting library.
     
    В настройках терминала разрешен ваш сервер:порт?
     
    Спасибо за отзыв. Если вы о настройке на вкладке Советники, то конечно разрешен, иначе была бы ошибка 4014.
     

     Yuriy Vasilyev Статью эту я видел. Но еще раз прочту внимательно. Спасибо.

    Yuriy Vasilyev
    Yuriy Vasilyev
    • 2024.05.15
    • www.mql5.com
    Профиль трейдера
     
    Автор статьи использует 443 порт.
     if(m_port!=443)
            {
             if(SocketConnect(m_socket,server,port,timeout))
                return(SocketTlsHandshake(m_socket,server));
            }

    На этом порту и у меня все работает. Собственно поэтому и возник вопрос, может ли работать защищенное соединение на другом порту.