Как избежать предупреждений о недопустимых сертификатах при переходе на мой пользовательский локальный HTTPS-сервер?

#windows #ssl

#Windows #ssl

Вопрос:

Что я делаю: запускаю простой HTTPS-сервер на своем ПК, просматриваю localhost и пытаюсь избежать предупреждения, установив временный сертификат.

Следующий код основан на том, что я нашел в этом примере библиотеки QtHttpServer: https://github.com/qt-labs/qthttpserver/blob/master/tests/auto/qhttpserver/tst_qhttpserver.cpp

Библиотека была собрана и протестирована без проблем.

Это мой код:

 #include <QCoreApplication>
#include <QtHttpServer/QtHttpServer>

static const char g_privateKey[] = R"(-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDykG51ZjNJra8iS27g3DJojH1qG8C3Z Avo5U6Qz6NkOsjvr22
gXqOS4uwVUXdCAKxsP0Wwn2zGz5vxGpLPVKtbAmaqHYZuipMG/Qun3t QYBgR 9t
lmHdI8TNP2Om8stDO5uQyBH7DcMjPyIgpfc8fBoNLhCn4oC2n6JK9EMuhQIDAQAB
AoGAUHTLzrEJjgTINI3kxz0Ck18WMl3mPG9 Ew8lbl/jnb1V4VNhReoIpq40NVbz
h28ixaG5MRVt8Dy3Jwd1YmOCylHSujdFQ2u0pcHFmERgDS2bOMwMTRoFOj2qgMGS
9SM iXlPY5AQY8nEg7rLjMSfaC/8Hq4RXpkj4PeHh6N7AzkCQQD  HzM3xBr Gvh
zco9Kt8IiKNlfeiA5gUQq1UPJzcWIEgW1Tgr5UzMUOcZ0HfYwhqL3 wMhzN4sba 
1plB1QRXAkEA84sfM0jm9BRSqtYTPlhsYAmuPjeo24Pxel8ijEkToAu0ppEC6AQ3
zfwZD0ISgaWQ7af5TN/RCsoNVX79twP6gwJBANbtB Z6shERm38ARdZB6Tf8ViAb
fn4JZ4OhqVXYrKrOE3aLzYnTBGXGXMh53kytcksuOoBlB5JZ274Kj63arokCQFPo
9xMAZzJpXiImJ/MvHAfqzfH501/ukeCLrqeO9ggKgG9zPwEZkvCRj0DGjwHEPa7k
VOy7oJaLDxUJ7/iCkmkCQQCtTLsvDbGH4tyFK5VIPJbUcccIib dTzSTeONdUxKL
Yk C6o7OpaUWX ikp4Ow/6iHOAgXaeA2OolDer/NspUy
-----END RSA PRIVATE KEY-----)";

static const char g_certificate[] = R"(-----BEGIN CERTIFICATE-----
MIICrjCCAhegAwIBAgIUcuXjCSkJ2 v/Rqv/UHThTRGFlpswDQYJKoZIhvcNAQEL
BQAwaDELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkZyYW5jZTERMA8GA1UEBwwIR3Jl
bm9ibGUxFjAUBgNVBAoMDVF0Q29udHJpYnV0b3IxHTAbBgNVBAMMFHFodHRwc3Nl
cnZlcnRlc3QuY29tMCAXDTE5MDkyNjA4NTc1MloYDzIyNTUwMzEzMDg1NzUyWjBo
MQswCQYDVQQGEwJGUjEPMA0GA1UECAwGRnJhbmNlMREwDwYDVQQHDAhHcmVub2Js
ZTEWMBQGA1UECgwNUXRDb250cmlidXRvcjEdMBsGA1UEAwwUcWh0dHBzc2VydmVy
dGVzdC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPKQbnVmM0mtryJL
buDcMmiMfWobwLdn4C jlTpDPo2Q6yO vbaBeo5Li7BVRd0IArGw/RbCfbMbPm/E
aks9Uq1sCZqodhm6Kkwb9C6fe35BgGBH722WYd0jxM0/Y6byy0M7m5DIEfsNwyM/
IiCl9zx8Gg0uEKfigLafokr0Qy6FAgMBAAGjUzBRMB0GA1UdDgQWBBTDMYCcl2jz
UUWByEzTj5Ew/LWkeDAfBgNVHSMEGDAWgBTDMYCcl2jzUUWByEzTj5Ew/LWkeDAP
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAMNupAOXoBih6RvuAn3w
W8jOIZfkn5CMYdbUSndY/Wrt4p07M8r9uFPWG4bXSwG6n9Nzl75X9b0ka/jqPjQ3
X769simPygCblBp2xwE6w14aHEBx4kcF1p2QbC1vHynszJxyVLvHqUjuJwVAoPrM
Imy6LOiw2tRTHPsj7UH16M6C
-----END CERTIFICATE-----)";

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    QHttpServer httpServer;

    httpServer.route("/", []() { return "Hello world"; });

    httpServer.sslSetup(QSslCertificate(g_certificate),
                        QSslKey(g_privateKey, QSsl::Rsa));

    if (httpServer.listen(QHostAddress("127.0.0.1"),443)) {
        qDebug() << "Server started";
        return a.exec();
    }
    else {
        qDebug() << "Server failed to start";
        return 0;
    }
}
 

Значения закрытого ключа и сертификата были буквально скопированы из примера QtHttpServer.

Сервер запускается, и я могу перейти к localhost (или qhttpsservertest.com , для которого я создал псевдоним в файле etc, просто чтобы убедиться, что он соответствует CN сертификата).

Однако, как и ожидалось, отображается предупреждение, и мне нужно подтвердить, прежде чем что-либо просматривать.

Я знаю, что могу добавить доверенный сертификат в ОС (в моем случае Windows). Другим программам, таким как Fiddler или Burp Suite, требуется нечто подобное для прозрачной работы с браузерами.

Но я не знаю, что здесь делать. Я просто скопировал содержимое сертификата в файл .cert и успешно импортировал его с помощью certmgr, но я продолжаю получать те же предупреждения при переходе на свой пользовательский сервер. Почему?

— РЕДАКТИРОВАТЬ —

Кажется, это не имеет ничего общего с Qt или QtHttpServer.

Я протестировал сертификат с помощью Nginx и по-прежнему получаю то же предупреждение браузера (ERR_CERT_COMMON_NAME_INVALID).

К вашему сведению, файл nginx.conf:

 # ...
http {
    # ...
    server {
        listen       443 ssl;
        server_name  qhttpsservertest.com;
        ssl_certificate     qhttpsservertest.pem;
        ssl_certificate_key qhttpsservertest.key;
        # ...
    }
    # ...
}
 

Это открывает вопрос для более широкой публики.

Какие манипуляции мне нужно выполнить в моей системе, чтобы избавиться от этих предупреждений?

Комментарии:

1. Что именно является вашим предупреждающим сообщением?

2. @Le Ngoc Thuong В нем говорится, независимо от браузера: «Ваше соединение не является частным… бла-бла-бла …NET::ERR_CERT_COMMON_NAME_INVALID». И вместо значка замка в адресной строке я получаю «небезопасно». При нажатии на это отображается «Сертификат (недействительный)».

3. Возможно, вам следует попробовать создать сертификат самостоятельно.

4. @Le Ngoc Thuong Я сделал это с помощью OpenSSL. Фактически, это было первое, что я сделал, прежде чем использовать пример QtHttpServer.

5. Вы пытались добавить сертификат в доверенный корень?

Ответ №1:

К счастью, я нашел краткое пошаговое руководство здесь.

Я игнорировал первые два шага. Я добавлял подписанный сертификат в доверенный корень.

Я надеюсь, что этот вопрос поможет другому новичку в будущем.