【问题标题】:Is InternetOpenUrl function on Windows secure enough? If not, how to make it stronger?Windows 上的 InternetOpenUrl 功能是否足够安全?如果没有,如何让它变得更强?
【发布时间】:2015-04-09 17:50:47
【问题描述】:

InternetOpenUrl() 文档说:

WinINet 函数通过比较匹配的主机名和简单的通配符规则对证书进行简单检查。

这表明它并没有做太多,并且可以通过例如伪造自签名证书。

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

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

【问题讨论】:

    标签: c winapi wininet


    【解决方案1】:

    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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多