Qt QSslSocket“证书是自签名的,不受信任”

Posted

技术标签:

【中文标题】Qt QSslSocket“证书是自签名的,不受信任”【英文标题】:Qt QSslSocket "The certificate is self-signed, and untrusted" 【发布时间】:2015-10-28 03:07:51 【问题描述】:

我想用 QSslSocket 连接服务器,在服务器上我得到 soketSslError "The certificate is self-signed, and untrusted" ,但我不明白为什么我有这个错误。

第一步是使用 openssl 为服务器和客户端生成文件

$openssl req -new -newkey rsa:1024 -keyout ca.key -x509 -days 500 -out ca.crt
$openssl req -new -newkey rsa:1024 -keyout client01.key -out client01.csr
$openssl ca -config ca.config -in  client01.csr -out client01.crt -batch

在 C++ 服务器/客户端中

在服务器上:

启动服务器

if (listen(QHostAddress::Any,this->connectingPort)) 
        std::cout<<"Server start on port: "<<this->connectingPort<<std::endl;
        return true;
     else 
        std::cout<<"Cant start server. "<<errorString().toStdString().c_str()<<std::endl;
        return false;
    

incomingConnection

    QFile keyFile("ca.key");
    if (!keyFile.open(QIODevice::ReadOnly)) 
        delete this->sslSocket;
        qDebug()<<"Cant open file: "<<keyFile.fileName();
        return false;
    
    QByteArray pasp ="qwerty";
    QSslKey key(keyFile.readAll(),QSsl::Rsa,QSsl::Pem,QSsl::PrivateKey,pasp);
    if (key.isNull()) 
        delete this->sslSocket;
        qDebug()<<"key in file "<<keyFile.fileName()<<" is empty";
        return false;
    
    keyFile.close();

    this->sslSocket->setPrivateKey(key);
    this->sslSocket->setPeerVerifyMode(QSslSocket::VerifyPeer);
    this->sslSocket->setLocalCertificate("ca.crt");
    this->sslSocket->startServerEncryption();

在客户端:

this->sslSocket->setPeerVerifyMode(QSslSocket::VerifyPeer);


QFile keyFile("client01.key");

if (!keyFile.open(QIODevice::ReadOnly)) 
    delete this->sslSocket;
    qDebug()<<"Cant open file: "<<keyFile.fileName();
    return ;

QByteArray pasp ="qwerty";
QSslKey key(keyFile.readAll(),QSsl::Rsa,QSsl::Pem,QSsl::PrivateKey,pasp);
if (key.isNull()) 
    delete this->sslSocket;
    qDebug()<<"key in file "<<keyFile.fileName()<<" is empty";
    return ;

keyFile.close();

this->sslSocket->setPrivateKey(key);

this->sslSocket->setLocalCertificate("client01.crt");

this->sslSocket->connectToHostEncrypted("192.168.0.10",1258);

if (!this->sslSocket->waitForEncrypted()) 
    qDebug()<<"error: "<<sslSocket->errorString();

当我从客户端连接时出现服务器错误

soket ssl error
"The certificate is self-signed, and untrusted" 
"The certificate is self-signed, and untrusted" 
socketError:  QAbstractSocket::SocketError( 13 ) 

知道我做错了什么吗?

更新:

Qt Creator 3.0.1 基于Qt 5.2.1(GCC 4.8.2,64位)

【问题讨论】:

您使用的是哪个版本的 Qt? Qt Creator 3.0.1 基于 Qt 5.2.1(GCC 4.8.2,64 位)于 2014 年 4 月 9 日 09:12:59 构建 请看这里,bugreports.qt.io/browse/QTBUG-7200 他们说这是在 5.3 中修复的 您好 - 您的 this 指的是什么? 【参考方案1】:

问题已解决

我做了什么: 为 5.5 更新版本 Qt 并生成新的 ssl 证书:

openssl req -x509 -newkey rsa:1024 -keyout key.key -out key.pem -days 365 -nodes 

在服务器中:

sslServer.setSslLocalCertificate("key.pem");
sslServer.setSslPrivateKey("key.key");
sslServer.setSslProtocol(QSsl::TlsV1_2);

在客户端:

sslSocket.addCaCertificates("key.pem");

【讨论】:

【参考方案2】:

我建议你在服务器上试试这个:

QList<QSslCertificate> cert = QSslCertificate::fromPath(QLatin1String("your-certificate.pem"));
QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
QList<QSslError> expectedSslErrors;
expectedSslErrors.append(error);

this->sslSocket.ignoreSslErrors(expectedSslErrors);

【讨论】:

我可能会出错,但正如我在 "your-certificate.pem" 中理解的那样,我添加了 client01.pem 文件,但没有任何改变。这是我拥有的所有文件:ca.crt、ca.key、c​​lient01.key、c​​lient01.crt、client01.pem

以上是关于Qt QSslSocket“证书是自签名的,不受信任”的主要内容,如果未能解决你的问题,请参考以下文章

Qt笔记-QSslSocket双向认证

Qt QSslSocket“证书是自签名的,不受信任”

Qt笔记-解决QSslSocket中QWaitCondition: Destroyed while threads are still waiting问题

不使用 SSL 时出现 QSslSocket 错误

qt查看是否支持SSL

qt获取以来的openssl的版本