准备安全套接字连接
为了将套接字连接转换为受保护状态并进行检查,MQL6 提供了以下函数:SocketTlsHandshake 和 SocketTlsCertificate。通常情况下,如果连接是建立在 443 端口上的,我们不需要通过调用 SocketTlsHandshake 来“手动”启用保护。事实是,这对于 HTTPS (TLS) 来说是标准的。
保护基于客户端和服务器之间数据流的加密,最初使用一对非对称密钥:公钥和私钥。我们已经在 可用信息转换方法概述一节中讨论过这个主题。每个正规网站都会从网络社区信任的某个证书颁发机构 (CA) 获取数字证书。该证书包含网站的公钥,并由该中心数字签名。浏览器和其他客户端应用程序会存储(也可以导入)CA 的公钥,因此可以验证特定证书的质量。
建立安全的 TLS 连接
(图片来自互联网)
此外,在准备安全连接时,浏览器或应用程序会生成某个“秘密”,用站点的公钥加密这个秘密并将其发送给站点,站点则用只有自己知道的私钥解密秘密。这个阶段在实践中看起来更复杂,但最终将确保客户端和服务器都拥有当前会话(连接)的加密密钥。通信的双方都使用此密钥在一端加密后续的请求和响应,并在另一端解密它们。
SocketTlsHandshake 函数使用 TLS 握手协议启动与指定主机的安全 TLS 连接。在这种情况下,客户端和服务器就连接参数达成一致:所用协议的版本和数据加密方法。
bool SocketTlsHandshake(int socket, const string host)
函数参数中传递了套接字句柄和建立连接的服务器地址(实际上,这与在 SocketConnect 中指定的名称相同)。
在建立安全连接之前,程序必须首先使用 SocketConnect与主机建立常规的 TCP 连接。
函数成功时返回 true;否则返回 false。如果发生错误,代码 5274 (ERR_NETSOCKET_HANDSHAKE_FAILED) 会被写入 _LastError。
SocketTlsCertificate 函数获取用于保护网络连接的证书信息。
int SocketTlsCertificate(int socket, string &subject, string &issuer, string &serial, string &thumbprint, datetime &expiration)
如果已为该套接字建立了安全连接(无论是在显式且成功的 SocketTlsHandshake 调用之后,还是在通过 443 端口连接之后),此函数会通过套接字描述符将相应信息填充到所有其他引用变量中:证书所有者名称 (subject)、证书颁发者名称 (issuer)、序列号 (serial)、数字指纹 (thumbprint) 和证书有效期 (expiration)。
函数在成功收到证书相关信息时返回 true,如果出错则返回 false。错误代码是 5275 (ERR_NETSOCKET_NO_CERTIFICATE)。这可以用来确定通过 SocketConnect 打开的连接是否立即处于受保护模式。我们将在下一节的示例中运用这一点。