首页 > 解决方案 > 浏览到我的自定义本地 HTTPS 服务器时如何避免无效证书警告?

问题描述

我在做什么:在我的 PC 上运行一个简单的 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;
    }
}

Private Key 和 Certificate 值是从 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;
        # ...
    }
    # ...
}

这向更广大的公众提出了这个问题。

我需要在我的系统中进行什么样的操作才能消除这些警告?

标签: windowsssl

解决方案


幸运的是,我在这里找到了简明的分步指南。

我忽略了前两个步骤。我正在将签名证书添加到受信任的根。

我希望这个问题对将来的另一个新手有所帮助。


推荐阅读