Можно ли создать новый QSslSocket и передать его в собственность существующему TCP-соединению, а также старую QTcpSocket, которую следует отбросить, не прерывая или не закрывая TCP-соединение?
Мне нужно это для реализации явного FTPS на моем FTP-сервере, который требует, чтобы изначально соединение было незашифрованным, и только по запросу клиента FTP (команда AUTH SSL
или же AUTH TLS
), если это вообще происходит, инициируется рукопожатие SSL / TLS.
Да, это возможно. Самый простой способ сделать это — заменить QTcpSocket
с QSslSocket
, QSslSocket
будет вести себя так же, как нормальный QTcpSocket
(без шифрования), пока вы не позвоните startClientEncryption
, После этого QSslSocket
будет действовать как нормальный QTcpSocket
но вся связь зашифрована в фоновом режиме.
Используя это, я фактически смог портировать проект с 100k + линиями и использовать SSL менее чем за час.
Нет (реальных) накладных расходов для использования QSslSocket
в незашифрованном режиме, так как он просто вызовет соответствующий QTcpSocket
метод. Например, метод чтения (qsslsocket.cpp
Qt 4.8.3):
if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
readBytes = d->plainSocket->read(data, maxlen);
} else {
//encryption stuff
Других решений пока нет …