为什么我无法获得有关用户使用的证书的正确信息?

时间:2014-05-21 16:36:36

标签: c++ qt ssl openssl

有两个完全不同的网站。他们有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;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

来自Qt文档:

  

因为在握手阶段设置了对等证书,所以它是   安全地从连接到的插槽访问对等证书   sslErrors()信号或encrypted()信号。

     

如果返回空证书,则可能表示SSL握手   失败,或者它可能意味着您所连接的主机没有   证书,或者它可能意味着没有联系。

因此,您应该在本地插槽中收到QSslSocket :: encrypted信号后尝试获取客户端证书。

您还应注意,如果您的客户没有证书,那么peerCertificate()将返回空值。