InternetOpenUrl()文档说明:
WinINet函数通过比较匹配的主机名和简单的通配符规则,对证书使用简单的检查。
这表明它的作用不大,可以通过伪造自签名证书来规避。
另一方面,KB 182888 "How To Handle Invalid Certificate Authority Error with WinInet"表明WinInet函数确实在检查根CA。
真相是什么?如果证书无效,我希望InternetOpenUrl()失败。或者如果它没有失败,那么就用最简单的方法亲自验证证书。我该怎么做?

最佳答案

tl;dr;Yes,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;
}

是的,当使用自签名证书时,它返回错误代码12045,这是错误的INTERNET无效的CA。

09-28 01:49