Минимальный рабочий пример 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, оба из которых чрезвычайно популярны...

Любые подсказки?

Спасибо за любую помощь, которую вы можете предложить, и с наилучшими пожеланиями!

0 ответов

Другие вопросы по тегам