C++ 尝试使用自签名证书连接时,QT 5.5 SSLHandshakeFailedError错误

C++ 尝试使用自签名证书连接时,QT 5.5 SSLHandshakeFailedError错误,c++,qt,network-programming,ssl-certificate,C++,Qt,Network Programming,Ssl Certificate,我使用以下代码尝试建立到远程主机的连接 客户端必须使用自签名证书进行身份验证,才能创建有效的SSL连接: QRemoteProxyCommunication::QRemoteProxyCommunication(QObject *parent) : QObject(parent) { QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkRequest request; QF

我使用以下代码尝试建立到远程主机的连接

客户端必须使用自签名证书进行身份验证,才能创建有效的SSL连接:

QRemoteProxyCommunication::QRemoteProxyCommunication(QObject *parent) : QObject(parent) {
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    QNetworkRequest request;

    QFile certFile("/path/to/file/clientcert.p12");
    certFile.open(QFile::ReadOnly);
    QSslCertificate certificate;
    QSslKey key;
    QList<QSslCertificate> importedCerts;

    bool imported = QSslCertificate::importPkcs12(&certFile, &key, &certificate, &importedCerts, QByteArray::fromStdString(""));
    qDebug() << "Imported: " << imported;

    QSslConfiguration config = request.sslConfiguration();

    config.setCaCertificates(importedCerts);
    config.setProtocol(QSsl::AnyProtocol);
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    request.setSslConfiguration(config);
    request.setUrl(QUrl("https://www.url.com"));
    reply = manager->get(request);;

    qDebug() << " Certs: " << certificate;

    qDebug() << reply->error();
    qDebug() << reply->errorString();

    connect(reply, SIGNAL(readyRead()), this, SLOT(replyReadyRead()));
    connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(replyNetworkError(QNetworkReply::NetworkError)));
    connect(manager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>)),
            this, SLOT(errors(QNetworkReply*, const QList<QSslError>)));
    connect(manager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>)),
            this, SLOT(errors(QNetworkReply*, const QList<QSslError>)));

}

void QRemoteProxyCommunication::replyNetworkError(QNetworkReply::NetworkError code) {

    qDebug() << "Network error => " << code;
}
QRemoteProxyCommunication::QRemoteProxyCommunication(QObject*parent):QObject(parent){
QNetworkAccessManager*manager=新的QNetworkAccessManager(此);
QNetworkRequest请求;
QFile证书文件(“/path/to/file/clientcert.p12”);
打开(QFile::ReadOnly);
QSSL证书;
QSslKey;
QList导入证书;
bool imported=QSslCertificate::importPkcs12(&certFile,&key,&certificate,&importedCerts,QByteArray::fromStdString(“”);

qDebug()问题是在
importPkcs12
函数中作为参数传递的引用对象(如
QSslKey
)没有在
QSslConfiguration
配置对象中显式设置

QFile certFile("/path/to/file/clientcert.p12");
certFile.open(QFile::ReadOnly);
QSslCertificate certificate;
QSslKey key;
QList<QSslCertificate> importedCerts;

bool imported = QSslCertificate::importPkcs12(&certFile, &key, &certificate, &importedCerts, QByteArray::fromStdString("xxxx"));

QSslConfiguration config = request.sslConfiguration();

config.setCaCertificates(importedCerts);
config.setLocalCertificate(certificate);
config.setPrivateKey(key);
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
QFile证书文件(“/path/to/file/clientcert.p12”);
打开(QFile::ReadOnly);
QSSL证书;
QSslKey;
QList导入证书;
bool imported=QSslCertificate::importPkcs12(&certFile,&key,&certificate,&importedCerts,QByteArray::fromStdString(“xxxx”);
QSslConfiguration=request.sslConfiguration();
配置设置证书(导入证书);
config.setLocalCertificate(证书);
config.setPrivateKey(密钥);
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
添加丢失的线路后,连接成功建立