Тут речь будет о том, как в Qt4 реализовать Tcp сервер с поддержкой TLSv1_2 .
Клиент с TLSv1_2 у нас уже работает, смотрите TLSv1_2 клиент на Qt4 .
А вот с сервером нам придется ещё повозиться.
Изначально в Qt4 ещё нет QSslServer, но мы его сделаем сами.
Итак сначала надо правильно подключить библиотеки openssl, желательно с выводом отладочной информации и с возможностью прохода отладчиком по коду самого openssl.
В двух словах мы должны при запуске сервера задать две части ключа для нашего сервера (открытую и закрытую).
Потом мы должны где-то указать серверу использовать TLSv1_2. Делаем это в initSslContext функции.
StartHandShake
Далее проверяем как выполняется метод startHandShake. Этот метод анализирует первые принятые байты от клиента и детектирует какой протокол будет использоваться.
Примечание: openssl у нас используется версии 1.0.2u.
Включаем в network.pro следующие дейфайны
DEFINES += QSSLSOCKET_DEBUG
DEFINES += QTCPSERVER_DEBUG
пересобираем ветку network.pro и уже кое-что видим в логах программы:
systemCaCertificates retrieval time 465 ms
imported 283 certificates
QTcpServer::listen(44735, "0.0.0.0") == true (listening on port 44735)
Now listening on 0.0.0.0:44735
QTcpServerPrivate::_q_processIncomingConnection() accepted socket 1004
SslServer::incomingConnection socketDescriptor 1004
QSslSocket::QSslSocket( SslServer(0x2fef78c) ), this = 0x435c308
sslSocket QSslSocket(0x435c308)
QSslSocket::setSocketDescriptor( 1004 , QAbstractSocket::ConnectedState , OpenMode( "ReadOnly|WriteOnly" ) )
QSslSocket::_q_stateChangedSlot( QAbstractSocket::ConnectedState )
setProtocol m_sslProtocol 6
QSslSocket::startServerEncryption()
startHandshake false
QSslSocketBackendPrivate::transmit: testing encryption
QSslSocketBackendPrivate::transmit: encryption not done yet
New connection
sslSocket->isOpen(): true
sslSocket->isReadable(): true
sslSocket->isWritable(): true
sslSocket->isSequential(): true
sslSocket->isEncrypted(): false
sslSocket->isValid(): true
QSslSocket::_q_readyReadSlot() - 517 bytes available
QSslSocketBackendPrivate::transmit: read 517 encrypted bytes from the socket
QSslSocketBackendPrivate::transmit: testing encryption
QSslSocketBackendPrivate::transmit: encryption not done yet
QSslSocketBackendPrivate::transmit: wrote 1115 encrypted bytes to the socket 1115 actual.
QSslSocketBackendPrivate::transmit: testing encryption
QSslSocketBackendPrivate::transmit: encryption not done yet
QSslSocketBackendPrivate::transmit: testing encryption
QSslSocketBackendPrivate::transmit: encryption not done yet
QSslSocket::_q_bytesWrittenSlot( 1115 )
QSslSocket::_q_readyReadSlot() - 7 bytes available
QSslSocketBackendPrivate::transmit: read 7 encrypted bytes from the socket
QSslSocketBackendPrivate::transmit: testing encryption
QSslSocketBackendPrivate::startHandshake: error! "Error during SSL handshake: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown"
QSslSocket::abort()
QSslSocket::_q_stateChangedSlot( QAbstractSocket::UnconnectedState )
QSslSocket::_q_disconnectedSlot()
state = QAbstractSocket::UnconnectedState
QSslSocket::close()
QSslSocketBackendPrivate::transmit: connection lost
ERROR: could not receive message (Unknown error)
Пока понятно только,что:
startHandshake: error! "Error during SSL handshake: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown"
и еще ssl3_read_bytes относится к tls или нет...