我正在尝试让客户端证书与 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 服务器通信,这两者都非常受欢迎......
有什么提示吗?
感谢您提供的任何帮助和最诚挚的问候!