QSslServer в Qt4

Тут речь будет о том, как в 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 или нет...