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。