有两个完全不同的网站。他们有2个不同的证书。 下面描述的程序充当服务器。客户端是一个浏览器。 当我去不同的网站服务我的https服务器时,我不断得到一个哈希。
#include <QCoreApplication>
#include "server.h"
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
Server h;
return a.exec();
}
///////////////////////////////////////
#ifndef SERVER_H
#define SERVER_H
#include <QTcpServer>
class Server : public QTcpServer {
public:
Server();
void incomingConnection(int);
};
#endif // SERVER_H
///////////////////////////////////////////
#include "server.h"
#include <QSslSocket>
#include <QSslCertificate>
Server::Server() {
if (!listen(QHostAddress::Any, 80)) {
//error
}
}
void Server::incomingConnection(int d) {
QSslSocket * socket = new QSslSocket();
if(socket->setSocketDescriptor(d)) {
socket->setProtocol(QSsl::AnyProtocol);
//always one hash. why?
qDebug() << socket->peerCertificate().digest(QCryptographicHash::Sha1).toHex();
QString c, k;
c = "site.crt";
k = "site.key";
socket->setLocalCertificate(c);
socket->setPrivateKey(k);
socket->startServerEncryption();
if(socket->waitForEncrypted()) {
if(socket->waitForReadyRead()) {
socket->write(socket->readAll());
socket->waitForBytesWritten();
socket->disconnectFromHost();
if(socket->state() == QTcpSocket::UnconnectedState) {
socket->waitForDisconnected();
}
socket->close();
socket->deleteLater();
}
else {
delete socket;
}
}
else {
delete socket;
}
}
}
答案 0 :(得分:1)
来自Qt文档:
因为在握手阶段设置了对等证书,所以它是 安全地从连接到的插槽访问对等证书 sslErrors()信号或encrypted()信号。
如果返回空证书,则可能表示SSL握手 失败,或者它可能意味着您所连接的主机没有 证书,或者它可能意味着没有联系。
因此,您应该在本地插槽中收到QSslSocket :: encrypted信号后尝试获取客户端证书。
您还应注意,如果您的客户没有证书,那么peerCertificate()将返回空值。