Một boost-asio
SSL/TLS TCP socket được thực hiện như một ssl::stream
hơn một tcp::socket
:Cách thích hợp để ngắt kết nối an toàn ổ cắm ASIO SSL là gì?
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
Trong giao thức TLS, ngừng hoạt động mã hóa bảo mật liên quan đến các bên trao đổi close_notify
tin nhắn. Chỉ cần đóng lớp thấp nhất có thể làm cho phiên dễ bị tổn thương với một số truncation attack.
Trong boost asio ssl async_shutdown always finishes with an error? @Tanner Sansbury mô tả quá trình shutdown SSL chi tiết với một số kịch bản và đề xuất sử dụng một async_shutdown
tiếp theo là một async_write
để ngắt kết nối một dòng SSL trước khi đóng socket:
ssl_socket.async_shutdown(...);
const char buffer[] = "";
async_write(ssl_socket, buffer, [](...) { ssl_socket.close(); })
Thực hiện một async_shutdown
trên số ssl::stream
gửi thông báo SSL close_notify
và đợi phản hồi từ đầu kia. Mục đích của việc ghi vào luồng sau khi async_shutdown
được thông báo khi async_shutdown
gửi close_notify
để ổ cắm có thể được đóng mà không cần chờ phản hồi. Tuy nhiên, trong hiện tại (1,59) phiên bản của boost cuộc gọi đến async_write
thất bại ...
Trong How to gracefully shutdown a boost asio ssl client? @maxschlepzig đề nghị tắt máy thu của socket TCP cơ bản:
ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
này tạo ra một lỗi short read
, và async_shutdown
được gọi khi nó được phát hiện trong xử lý lỗi:
// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
ec.value() == ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ))
{
// -> not a real error:
do_ssl_async_shutdown();
}
Hoặc hủy thao tác đọc/ghi trên ổ cắm và sau đó gọi SSL async tắt máy, tức là .:
boost::system::error_code ec;
ssl_socket.cancel(ec);
ssl_socket.async_shutdown([](...) { ssl_socket.close(); };
Tôi hiện đang sử dụng phương pháp cuối cùng này vì nó làm việc với phiên bản hiện tại của boost
.
Cách chính xác/tốt nhất để ngắt kết nối an toàn ổ cắm SSL boost-asio
là gì?
Điều đó tùy thuộc. Nếu bạn đã nhận được một 'close_notify', bạn không có nghĩa vụ phải gửi một. – EJP
Có, nhưng bạn không phải đợi để nhận được 'close_notify' sau khi bạn đã gửi. – kenba