Минимальный рабочий пример QWebEngine с клиентскими сертификатами?
Я пытаюсь заставить клиентские сертификаты работать с веб-движком Qt (версия 5.15), но у меня не получается!
У меня есть локальный сервер, настроенный на использование SSL, ожидание клиентских сертификатов и проверка их на соответствие локально созданному корневому сертификату 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 --insecure https://localhost/ --cert client.pem --key client.key
Я пробовал деактивировать клиентские сертификаты на стороне сервера, и все работает нормально.
Есть ли проблемы с моим примером? Я пропустил некоторые шаги инициализации или что-то в этом роде?
Может быть, мой пример БЫ БЫ РАБОТАЛ - если бы только клиент и сервер умели разговаривать друг с другом, чтобы, следовательно, ошибка действительно была в шифровальных наборах?! Есть ли способ проверить обмен и возможные алгоритмы? В конечном счете, я считаю это очень маловероятным, поскольку мы говорим о бэкэнде Chrome на стороне клиента, взаимодействующем с сервером Apache, оба из которых чрезвычайно популярны...
Любые подсказки?
Спасибо за любую помощь, которую вы можете предложить, и с наилучшими пожеланиями!