SSL handshake failed

yhgaven 2017-12-01 07:10:26
Qt 使用 https:// 发送请求,有一个.p12的证书安装程序,已经安装完成,libeay32.dll、ssleay32.dll也拷到了程序路径,但是发送数据后始终显示SSL handshake failed。
开始使用:
QSslConfiguration config;
config.setPeerVerifyMode(QSslSocket::VerifyNone);
config.setProtocol(QSsl::SslV3);
request.setSslConfiguration(config);
一直返回,想着是不是不是这么弄,可能应该是去调用那个证书文件,就改为用QSslCertificate::fromPath调用,但好像只有pem和Der类型,就用openssl 装成了pem,然后调用,结果certs.size()不为0了,可还是返回SSL handshake failed。
修改后代码:
QSslConfiguration config;
QList<QSslCertificate> certs = QSslCertificate::fromPath("D:\\XXX.pem");
qDebug() << "certs==" << certs.size();
m_certs = QString::number(certs.size());
config.setCaCertificates(certs);
request.setSslConfiguration(config);
ui->plainTextEdit->setPlaceholderText(m_certs);

QString str = ui->lineEdit->text();
request.setUrl(QUrl(str));
manager.get(request);

没怎么搞过ssl的,这个证书不知道怎么去调用,浏览器上发请求是能返回数据的,但程序就是握手失败,哪位大神有解决办法的指导下。
...全文
1557 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
善良大仙 2020-06-17
遇到同样的问题,两台win10 电脑,同样的客户端程序,一个可以,一个返回SSL handshake failed
  • 打赏
  • 举报
回复
yhgaven 2017-12-03
准备结贴了,进来的就给分结贴。
  • 打赏
  • 举报
回复
yhgaven 2017-12-03
都没人回复的吗
  • 打赏
  • 举报
回复
yhgaven 2017-12-02
自己解决了。 开始用QSslCertificate 加载p12的证书,然后用isNull()来查看设备是否包含一个证书,但修改类型也都是返回null。 原先代码: QString keyDir = QGuiApplication::applicationDirPath() + "/key/"; // 创建客户端证书 QFile fileCrt(keyDir+"客户端证书.p12"); if (!fileCrt.open(QIODevice::ReadOnly)) qDebug() << "!fileCrt.open==" ; const QSslCertificate certificate(&fileCrt, QSsl::Pem); fileCrt.close(); 后来想着改成pem的证书来加载,就安装了openssl,使用openssl pkcs12 -in d:\key2\证书.p12 -out d:\key2\客户端证书.pem -nodes 将证书导出为PEM格式,然后发现certificate不为空了,可是连接服务端时不报SSL handshake failed,却报需要密钥的错误。接着就用openssl pkcs12 -in d:\key2\证书.p12 -nocerts -out d:\key2\key.pem -nodes 得到私钥,创建客户端私钥,再通过QSslConfiguration 类进行SSL连接配置,最后终于能连通服务器发送数据成功了。 最后代码: QSslConfiguration m_config ; QString keyDir = QGuiApplication::applicationDirPath() + "/key/"; // 创建客户端证书 QFile fileCrt(keyDir+"客户端证书.pem"); if (!fileCrt.open(QIODevice::ReadOnly)) qDebug() << "!fileCrt.open==" ; const QSslCertificate certificate(&fileCrt, QSsl::Pem); fileCrt.close(); // 创建客户端私钥 QFile fileKey(keyDir+"key.pem"); fileKey.open(QIODevice::ReadOnly); const QSslKey prvateKey(&fileKey, QSsl::Rsa); fileKey.close(); m_config.setPeerVerifyMode(QSslSocket::VerifyNone); m_config.setProtocol(QSsl::TlsV1_0); m_config.setPrivateKey(prvateKey); m_config.setLocalCertificate(certificate); QNetworkRequest request; //加入ssl配置信息 request.setSslConfiguration(m_config); request.setUrl(QUrl(str)); manager.get(request);
  • 打赏
  • 举报
回复
相关推荐
发帖
Qt
加入

1.3w+

社区成员

Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
申请成为版主
帖子事件
创建了帖子
2017-12-01 07:10
社区公告
暂无公告