A/TLS gniazdo TCP boost-asio
SSL jest realizowany jako ssl::stream
ponad tcp::socket
:Jaki jest właściwy sposób bezpiecznego odłączenia gniazda asio SSL?
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
W protokole TLS, zaszyfrowanych zamknięcie wiąże stronom wymianę close_notify
wiadomości. Po prostu zamknięcie najniższej warstwy może spowodować, że sesja będzie narażona na ataki na truncation attack.
W boost asio ssl async_shutdown always finishes with an error? @Tanner Sansbury opisuje proces zamykania SSL szczegółowo w wielu sytuacjach i proponuje stosując async_shutdown
następnie przez async_write
odłączyć strumienia SSL przed zamknięciem gniazdo:
ssl_socket.async_shutdown(...);
const char buffer[] = "";
async_write(ssl_socket, buffer, [](...) { ssl_socket.close(); })
Performing an async_shutdown
na ssl::stream
wysyła komunikat SSL close_notify
i czeka na odpowiedź z drugiego końca. Zapisanie do strumienia po async_shutdown
należy zgłosić, gdy async_shutdown
wysłał close_notify
, aby gniazdo mogło zostać zamknięte bez oczekiwania na odpowiedź. Jednak w obecnej (1,59) wersji boost wywołanie async_write
zawodzi ...
W How to gracefully shutdown a boost asio ssl client? @maxschlepzig proponuje wyłączania odbiornika bazowego gniazda TCP:
ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
To daje błąd short read
, i async_shutdown
nazywa, kiedy to wykryto u obsługi błędu:
// 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();
}
lub anulowanie operacji odczytu/zapisu na gnieździe, a następnie wywołanie asynchronicznie SSL shutdown, tj .:
boost::system::error_code ec;
ssl_socket.cancel(ec);
ssl_socket.async_shutdown([](...) { ssl_socket.close(); };
obecnie używam tej ostatniej metody, ponieważ pracuje z aktualną wersją boost
.
Jaki jest najlepszy/najlepszy sposób bezpiecznego odłączenia gniazda SSL boost-asio
?
To zależy. Jeśli otrzymałeś "close_notify", nie musisz go wysyłać. – EJP
Tak, ale nie musisz czekać na otrzymanie "close_notify" po wysłaniu. – kenba