Windows 上的 InternetOpenUrl 功能是不是足够安全?如果没有,如何让它变得更强?

Posted

技术标签:

【中文标题】Windows 上的 InternetOpenUrl 功能是不是足够安全?如果没有,如何让它变得更强?【英文标题】: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() 失败。或者,如果它没有失败,则以最简单的方式自己验证证书。我该怎么做?

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于Windows 上的 InternetOpenUrl 功能是不是足够安全?如果没有,如何让它变得更强?的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS“任务栏”上的内容为

在Windows 上的 Python

如何从 Windows 10 上的容器连接到 docker 主机(Docker for Windows)

Windows 上的 WaitOnAddress() 在 Linux 上的完全等价物是啥?

为啥 Windows 上的 IE/Chrome 不支持端口 27977 上的 SOCKS5 代理? [关闭]

有啥方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序?