Windows 上的 InternetOpenUrl 函数是否足够安全?如果没有,如何让它更强大?

Is InternetOpenUrl function on Windows secure enough? If not, how to make it stronger?

InternetOpenUrl() 文档说:

WinINet functions use a simple check against certificates by comparing for matching host names and simple wildcarding rules.

这表明它做的不是很多,可以通过例如绕过它。伪造自签名证书。

另一方面,KB 182888 "How To Handle Invalid Certificate Authority Error with WinInet" 表明 WinInet 函数确实在检查根 CA。

真相是什么?如果证书无效,我希望 InternetOpenUrl() 失败。或者,如果它没有失败,则以最简单的方式自行验证证书。我该怎么做?

tl;博士;是的,默认情况下 InternetOpenUrl() 检查证书颁发机构。

我做了个小测试:

#include <cassert>
#include <iostream>
#include <windows.h>
#include <WinInet.h>

int main(int argc, char *argv[])
{
    HINTERNET internet = InternetOpenA("Test Agent",
                                      INTERNET_OPEN_TYPE_DIRECT,
                                      NULL,
                                      NULL,
                                      0);
    assert(internet != NULL);
    char url[] = "https://urlgoeshere";
    HINTERNET connection = InternetOpenUrlA(internet,
                                           url,
                                           NULL,
                                           0,
                                           0,
                                           NULL);
    std::cout << "error while opening url " << url << " : "
              << GetLastError()
              << " handle: " << connection << std::endl;


    return 0;
}

是的,当使用自签名证书时 returns 错误代码 12045,即 ERROR_INTERNET_INVALID_CA。