Windows 7, Qt5, собран последний openssl (но в path не прописывал).
Сгенерировал корневой сертификат, локальный сертификат для сервера, ключ, всё подписано как надо:
/* корневой ключ */
genrsa -out rootCA.key 2048
/* корневой сертификат */
req -x509 -new -key rootCA.key -days 10000 -out rootCA.crt -batch
/* Генерируем ключ */
genrsa -out server.key 2048
/* Создаем запрос на сертификат */
req -new -key server.key -out server.csr -subj /C=RU/ST=RnD/CN=my_host_name -batch
/* подписать запрос на сертификат нашим корневым сертификатом */
x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
Создаю простые программки клиента и сервера.
Вот так примерно сервер:
void CBerServer::incomingConnection( qintptr handle )
{
socket = new QSslSocket;
// задаем дескриптор сокету
if(socket->setSocketDescriptor(handle))
{
socket->setProtocol(QSsl::TlsV1_2);
QFile root_file("rootCA.crt");
root_file.open(QIODevice::ReadOnly);
QSslCertificate root_cert(&root_file);
// задаем корневой сертификат
socket->addCaCertificate(root_cert);
QFile crt_file("server.crt");
if(crt_file.open(QIODevice::ReadOnly))
{
QByteArray crt_data = crt_file.readAll();
crt_file.close();
QSslCertificate cert(crt_data);
// проверяем, не истек ли локальный сертификат
if(cert.expiryDate() >= QDateTime::currentDateTime())
{
// приватный ключ и локальный сертификат
socket->setPrivateKey("server.key");
socket->setLocalCertificate("server.crt");
// соединяем стандартные сигналы со слотами
connect(socket, &QSslSocket::encrypted, this, &CBerServer::ready);
connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(onSslErrors(const QList<QSslError> &)));
connect(socket, SIGNAL(readyRead()),
this, SLOT(onReceive()));
/* запускаем процесс "рукопожатия",
т.е. установки защищенного соединения */
socket->startServerEncryption();
}
}
else
{
delete socket;
}
}
}
Ну и на клиенте совсем просто:
QSslSocket *socket = new QSslSocket(this);
QFile root_file("rootCA.crt");
root_file.open(QIODevice::ReadOnly);
QSslCertificate root_cert(&root_file);
// Тот же корневой сертификат, и далее стандартно
socket->addCaCertificate(root_cert);
connect(socket, SIGNAL(encrypted()), this, SLOT(ready()));
bool bb = connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(sslErrors(const QList<QSslError> &)));
connect(socket, SIGNAL(readyRead()),
this, SLOT(onReceive()));
socket->setProtocol(QSsl::TlsV1_2);
socket->connectToHostEncrypted("localhost", 12345);
Проблема: не создается защищенное соединение по протоколам TLS 1.1 и TLS 1.2. По протоколам SSL 3 и TLS 1.0 работает. Ошибки никакие не выдаются