带有自签名证书的 InternetOpenUrl

Posted

技术标签:

【中文标题】带有自签名证书的 InternetOpenUrl【英文标题】:InternetOpenUrl with self signed certificate 【发布时间】:2020-07-30 10:01:47 【问题描述】:

以下代码用于下载文件,但如果服务器有自签名证书则不起作用:

DWORD errCode = 0;
HINTERNET intOpenHandle = InternetOpen("Snippet", LOCAL_INTERNET_ACCESS, NULL, 0, 0);
errCode = GetLastError();
if (intOpenHandle != NULL && errCode == ERROR_SUCCESS)

    HINTERNET urlOpenHandle = InternetOpenUrl(intOpenHandle, url, NULL, NULL, NULL, NULL);
    errCode = GetLastError();
    if (urlOpenHandle != NULL && errCode == ERROR_SUCCESS)
    
        ...

有没有办法修改它以使用自签名证书?

【问题讨论】:

你得到的错误代码是什么?否则尝试使用自定义 INTERNET_OPTION_SECURITY_FLAGS docs.microsoft.com/en-us/windows/win32/wininet/option-flags 调用 InternetSetOption(如 SECURITY_FLAG_IGNORE_***) ERROR_INTERNET_INVALID_CA (12045),并尝试使用SECURITY_FLAG_IGNORE_UNKNOWN_CA,但仍然是同样的错误... 你是在 InternetOpenUrl 之前调用它吗?尝试其他 SECURITY_FLAG_IGNORE_ 标志也可以看到:***.com/questions/41357008/… InternetOpen()InternetOpenUrl() 调用之间是的,因为后者给出了错误 12045。我会尝试其他 SECURITY_FLAG_IGNORE_* 标志... 试过SECURITY_FLAG_IGNORE_UNKNOWN_CASECURITY_FLAG_IGNORE_WEAK_SIGNATURE,但无济于事... 【参考方案1】:

InternetOpenUrl()InternetSetOptions() 似乎不可能:后者需要打开的连接句柄,而不是前者提供的会话句柄。 因此我不得不使用更长的版本:

DWORD errCode = 0;
HINTERNET intOpenHandle = InternetOpen("Snippet", LOCAL_INTERNET_ACCESS, NULL, 0, 0);
if (intOpenHandle != NULL)

     HINTERNET httpRequest = HttpOpenRequest(intConnect, "GET", urlPath, NULL, NULL, NULL,
                                             INTERNET_FLAG_SECURE, 0);
     if (httpRequest != NULL)
     
         DWORD dwFlags;
         DWORD dwBuffLen = sizeof(dwFlags);
         if (InternetQueryOption(httpRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, &dwBuffLen))
         
             dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_WEAK_SIGNATURE |
                        SECURITY_FLAG_IGNORE_WRONG_USAGE;
             InternetSetOption(httpRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
         
         if (HttpSendRequest(httpRequest, NULL, 0, NULL, 0))
         
             ...

【讨论】:

如果对您有帮助,您也可以随时accept your own answers。 想等待一个upvote,看看它是否对其他人有帮助......

以上是关于带有自签名证书的 InternetOpenUrl的主要内容,如果未能解决你的问题,请参考以下文章

带有自签名证书的 Amazon Beanstalk Web 服务器?

如何使用 OpenSSL 生成带有 SubjectAltName 的自签名证书? [关闭]

Infinispan 12:带有自签名证书的 CLI

带有 Python SSL 套接字的自签名证书

带有自签名证书的 Telegram bot webhook 不起作用

带有自签名证书的 ktor 客户端 https 请求