0

我正在尝试让客户端证书与 Qt Web 引擎(5.15 版)一起使用,但我似乎无法完成!

我有一个本地服务器设置为使用 SSL,期望客户端证书并根据本地创建的根 CA 证书检查它们。另一方面,客户端有一个由本地根 CA 签名的客户端证书。

这是我所能减少的范围......这可能太远了,导致问题!

#include <QApplication>
#include <QtWebEngine>
#include <QWebEngineProfile>
#include <QWebEngineView>

class MyWebPage : public QWebEnginePage
{
public:
    MyWebPage(QObject * Parent) :
        QWebEnginePage{Parent}
    {
        QObject::connect(this, &QWebEnginePage::selectClientCertificate, this, &MyWebPage::SelectClientCertificate);
    }
protected:
    auto certificateError(QWebEngineCertificateError const & CertificateError) -> bool override
    {
        return true;
    }
    
    auto SelectClientCertificate(QWebEngineClientCertificateSelection ClientCertificateSelection) -> void
    {
        ClientCertificateSelection.select(ClientCertificateSelection.certificates().front());
    }
};

auto main(int argc, char *argv[]) -> int
{
    QtWebEngine::initialize();
    auto Application = QApplication{argc, argv};
    
    auto WebView = QWebEngineView{};
    WebView.resize(1024, 750);
    WebView.show();
    
    auto ClientCertificateFile = QFile{"client.pem"};
    ClientCertificateFile.open(QIODevice::ReadOnly);
    auto ClientCertificate = QSslCertificate{&ClientCertificateFile};
    ClientCertificateFile.close();
    
    auto PrivateKeyFile = QFile{"client.key"};
    PrivateKeyFile.open(QIODevice::ReadOnly);
    auto PrivateKey = QSslKey{&PrivateKeyFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey};
    PrivateKeyFile.close();
    
    auto WebPage = MyWebPage{&WebView};
    WebPage.profile()->clientCertificateStore()->add(ClientCertificate, PrivateKey);
    WebPage.setUrl(QUrl{"https://localhost/"});
    WebView.setPage(&WebPage);

    return Application.exec();
}

我得到的是浏览器窗口中带有“ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS”的错误消息 - 显然浏览器和服务器不知道如何相互交谈。

我已经尝试过 curl 并且两者都可以正常工作

curl --tlsv1.2 --tls-max 1.2 --insecure https://localhost/ --cert client.certificate.pem --key client.private_key.key

或者

curl --tlsv1.3 --tls-max 1.3 --insecure https://localhost/ --cert client.certificate.pem --key client.private_key.key

我试过在服务器端停用客户端证书,它工作正常。

我的例子有问题吗?我错过了一些初始化步骤还是什么?

也许我的例子会起作用 - 如果只有客户端和服务器知道如何相互交谈,那么错误真的在密码套件中吗?!有什么方法可以检查交换的和可能的算法吗?最终,我发现这不太可能,因为我们谈论的是客户端的 Chrome 后端与 Apache 服务器通信,这两者都非常受欢迎......

有什么提示吗?

感谢您提供的任何帮助和最诚挚的问候!

4

0 回答 0