Chuẩn bị kết nối socket bảo mật
Để chuyển kết nối socket sang trạng thái được bảo vệ và kiểm tra nó, MQL6 cung cấp các hàm sau: SocketTlsHandshake
và SocketTlsCertificate
, tương ứng. Thông thường, chúng ta không cần "tự tay" bật bảo vệ bằng cách gọi SocketTlsHandshake
nếu kết nối được thiết lập trên cổng 443. Sự thật là điều này là tiêu chuẩn cho HTTPS (TLS).
Bảo vệ dựa trên việc mã hóa luồng dữ liệu giữa máy khách và máy chủ, mà ban đầu sử dụng một cặp khóa bất đối xứng: công khai và riêng tư. Chúng ta đã đề cập đến chủ đề này trong phần Tổng quan về các phương pháp chuyển đổi thông tin có sẵn. Mọi trang web uy tín đều mua chứng chỉ số từ một trong những cơ quan chứng nhận (CAs) được cộng đồng mạng tin cậy. Chứng chỉ chứa khóa công khai của trang web và được ký số bởi trung tâm. Các trình duyệt và ứng dụng máy khách khác lưu trữ (hoặc có thể nhập) các khóa công khai của CAs và do đó có thể xác minh chất lượng của một chứng chỉ cụ thể.
Thiết lập kết nối TLS bảo mật
(hình ảnh từ internet)
Hơn nữa, khi chuẩn bị một kết nối bảo mật, trình duyệt hoặc ứng dụng tạo ra một "bí mật" nhất định, mã hóa nó bằng khóa công khai của trang web và gửi khóa đó đến trang web, và trang web giải mã nó bằng khóa riêng mà chỉ trang web biết. Giai đoạn này trông phức tạp hơn trong thực tế, nhưng kết quả là cả máy khách và máy chủ đều có khóa mã hóa cho phiên hiện tại (kết nối). Khóa này được cả hai bên tham gia giao tiếp sử dụng để mã hóa các yêu cầu và phản hồi tiếp theo ở một đầu và giải mã chúng ở đầu kia.
Hàm SocketTlsHandshake
khởi tạo một kết nối TLS bảo mật với máy chủ được chỉ định bằng giao thức bắt tay TLS. Trong trường hợp này, máy khách và máy chủ thống nhất các tham số kết nối: phiên bản giao thức được sử dụng và phương pháp mã hóa dữ liệu.
bool SocketTlsHandshake(int socket, const string host)
Tay cầm socket và địa chỉ của máy chủ mà kết nối được thiết lập được truyền trong các tham số hàm (thực tế, đây là cùng tên đã được chỉ định trong SocketConnect
).
Trước khi kết nối bảo mật, chương trình phải thiết lập trước một kết nối TCP thông thường với máy chủ bằng SocketConnect
.
Hàm trả về true
nếu thành công; ngược lại, nó trả về false
. Trong trường hợp lỗi, mã 5274 (ERR_NETSOCKET_HANDSHAKE_FAILED) được ghi vào _LastError
.
Hàm SocketTlsCertificate
lấy thông tin về chứng chỉ được sử dụng để bảo mật kết nối mạng.
int SocketTlsCertificate(int socket, string &subject, string &issuer, string &serial, string &thumbprint, datetime &expiration)
Nếu một kết nối bảo mật được thiết lập cho socket (sau khi gọi SocketTlsHandshake
thành công rõ ràng hoặc sau khi kết nối qua cổng 443), hàm này điền vào tất cả các biến tham chiếu khác bằng mô tả socket với thông tin tương ứng: tên của chủ sở hữu chứng chỉ (subject
), tên nhà phát hành chứng chỉ (issuer
), số sê-ri (serial
), dấu vân tay số (thumbprint
), và thời hạn hiệu lực của chứng chỉ (expiration
).
Hàm trả về true
trong trường hợp nhận thông tin về chứng chỉ thành công hoặc false
do lỗi. Mã lỗi là 5275 (ERR_NETSOCKET_NO_CERTIFICATE). Điều này có thể được sử dụng để xác định liệu kết nối được mở bởi SocketConnect
có ngay lập tức ở chế độ bảo vệ hay không. Chúng ta sẽ sử dụng điều này trong một ví dụ ở phần tiếp theo.