Ho un'app client C++ che utilizza Boost ASIO per effettuare connessioni SSL a vari server. Ma contro 2 server specifici, la connessione SSL non può essere stabilita. Si blocca nella chiamata a boost::asio::ssl::stream::handshake()
.Boost ASIO: l'handshake SSL() non termina mai
Ho usato Wireshark per osservare la conversazione tra client e server. Una connessione SSL lavoro sembra fare questo:
sslsocket.lowest_layer().connect(endpoint, ec);
C -> SYN -> S
C <- SYN ACK <- S
C -> ACK -> S
sslsocket.handshake(SSLSocket::client, ec);
C -> 209 bytes -> S
C <- 690 bytes <- S
C -> 198 bytes -> S
C <- 415 bytes <- S
... ea questo punto i ASIO handshake()
chiamata rendimenti che indicano tutto va bene, e la connessione socket SSL funziona bene.
Ma contro 2 server diversi [*], la stretta di mano assomiglia a questo:
sslsocket.lowest_layer().connect(endpoint, ec);
C -> SYN -> S
C <- SYN ACK <- S
C -> ACK -> S
sslsocket.handshake(SSLSocket::client, ec);
C -> 209 bytes -> S
...2 minute pause...
C <- RST <- S
Guardando i file di log su questi server, sembra come se dopo i primi 209 byte vengono inviati nella stretta di mano, il server ha considerato la connessione SSL completamente stabilita. Ma il client è ancora presente nella chiamata di handshake() ASIO Boost e alla fine restituisce ec = 104 quando viene ripristinata la connessione.
Quindi penso che forse ci sono diversi tipi di handshake SSL, e forse c'è un "più semplice" che dovrei usare?
[*] So che qualcuno vorrà sapere: uno dei server che causa questo problema con l'app client è FileZilla Server per l'installazione di Windows per utilizzare SSL/TLS [FTPS], e l'altro è un servizio proprietario in esecuzione su Linux)
UPDATE:. Sam Miller ha chiesto che ho posto il mio codice che descrive come il contesto SSL è impostato:
Class (file .hpp) contiene questo:
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SSLSocket;
boost::asio::io_service ioservice;
boost::asio::ssl::context sslcontext;
SSLSocket sslDataSocket;
boost::system::error_code ec;
Costruttore ha queste initializers:
ioservice (2),
sslcontext (ioservice, boost::asio::ssl::context::sslv23),
sslDataSocket (ioservice, sslcontext),
... e di questo codice:
sslcontext.set_options(boost::asio::ssl::context::default_workarounds |
boost::asio::ssl::context::verify_none );
E questo è il codice in cui è stabilito il socket SSL e la stretta di mano si blocca:
std::cout << "connecting SSL socket to endpoint " << buffer << std::endl;
sslDataSocket.lowest_layer().connect(tcpEndpoint, ec);
std::cout << "connect() done, ec=" << ec.value() << std::endl;
if (ec) throw "test 1";
std::cout << "starting ssl handshake" << std::endl;
sslDataSocket.handshake(SSLSocket::client, ec);
std::cout << "handshake done, ec=" << ec.value() << std::endl;
if (ec) throw "test 2";
Domanda molto ben fatta. –
Recentemente ho avuto un problema con SSL [collegamento] (http://stackoverflow.com/questions/9411506/boosts-asio-ssl-dont-work-in-some-conditions). Il comando 'openssl s_client -connect server_ip: server_port' mi ha aiutato a capire la causa. Potrebbe essere che ti aiuterà anche. – megabyte1024
per favore pubblica il tuo codice descrivendo come è impostato il contesto ssl –