【问题标题】:How to receive data with WinHttpSendRequest from localhost如何使用 WinHttpSendRequest 从本地主机接收数据
【发布时间】:2019-06-13 12:02:17
【问题描述】:

我尝试使用 GET 参数接收一些数据。 当我尝试从网络地址获取数据时,它工作正常。 只是我将网络服务器更改为 localhost 我将无法接收数据并得到 ERROR 12175

我需要改变什么,我的代码适用于网络连接和本地主机测试?

当我在浏览器中输入本地主机地址时,我会收到预期的结果。

LPCWSTR server = L"www.airfieldmanager-game.de";    //this works fine
//LPCWSTR server = L"localhost";    //causes Error 12175 at WinHttpSendRequest. Variables hSession, hConnect and cRequest looks fine.
LPCWSTR serverRequest = L"/php/TestCURL.php?data=1&param=Gesendete Daten!";

// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen(L"WinHTTP Example/1.0",
    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
    WINHTTP_NO_PROXY_NAME,
    WINHTTP_NO_PROXY_BYPASS, 0);

// Specify an HTTP server.
if (hSession)
    hConnect = WinHttpConnect(hSession, server,
    INTERNET_DEFAULT_HTTP_PORT, 0);

// Create an HTTP request handle.
if (hConnect)
    hRequest = WinHttpOpenRequest(hConnect, L"GET", serverRequest,
    NULL, WINHTTP_NO_REFERER,
    WINHTTP_DEFAULT_ACCEPT_TYPES,
    WINHTTP_FLAG_SECURE);

// Send a request.
if (hRequest)
    bResults = WinHttpSendRequest(hRequest,
    WINHTTP_NO_ADDITIONAL_HEADERS, 0,
    WINHTTP_NO_REQUEST_DATA, 0,
    0, 0);


// End the request.
if (bResults)
    bResults = WinHttpReceiveResponse(hRequest, NULL);

if (!bResults)
{
    int i = GetLastError();    //when using loscalhost i becomes 12175
}

【问题讨论】:

  • 什么证书使用你的本地服务器?它是否包含 localhost
  • 我认为你需要WinHttpSetOptionWINHTTP_OPTION_SECURITY_FLAGS 来设置SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_UNKNOWN_CA
  • 我为 localhost 使用标准安装的 XAMPP。所以我认为不会安装证书。现在我尝试在 WinHttpOpen 之后直接添加一个 WinHttpSetOption //设置安全标志 DWORD dwSecOption = SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_UNKNOWN_CA; int itmp = WinHttpSetOption(hSession, WINHTTP_OPTION_SECURITY_FLAGS, &dwSecOption, sizeof(dwSecOption));
  • 为什么你在这种情况下使用WINHTTP_FLAG_SECURE
  • 谢谢,就是这样!用 0 删除了 WINHTTP_FLAG_SECURE,现在它适用于本地主机和网站。非常感谢。如何将您的答案标记为解决方案?

标签: c++ winapi winhttp


【解决方案1】:

错误12175 这是ERROR_WINHTTP_SECURE_FAILUREWinHttpSendRequest 解释此错误何时发生以及如何获取有关它的更多信息:

安全套接字层 (SSL) 中发现一个或多个错误 服务器发送的证书。确定是什么类型的错误 遇到过,通过验证 WINHTTP_CALLBACK_STATUS_SECURE_FAILURE 状态通知 回调函数。

所以对于调试诊断,您需要编写 self cb:

void CALLBACK WinHttpStatusCB(
                                      __in  HINTERNET hInternet,
                                      __in  DWORD_PTR dwContext,
                                      __in  DWORD dwInternetStatus,
                                      __in  LPVOID lpvStatusInformation,
                                      __in  DWORD dwStatusInformationLength
                                      )
{
    switch (dwInternetStatus)
    {
    case WINHTTP_CALLBACK_STATUS_SECURE_FAILURE:
        if (lpvStatusInformation && dwStatusInformationLength == sizeof(ULONG))
        {
            DbgPrint("SECURE_FAILURE:[%x]\n", *(PULONG)lpvStatusInformation);
            // ...
        }
        break;
    //...
    }
}

并激活它:

WinHttpSetStatusCallback(hSession, WinHttpStatusCB, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0);

WinHttpSetStatusCallback(hSession, WinHttpStatusCB, WINHTTP_CALLBACK_FLAG_SECURE_FAILURE, 0);

有了这个,您可以准确地找到失败的原因 - 几个 WINHTTP_CALLBACK_STATUS_FLAG_* 标志。

如果dwInternetStatus 参数是 WINHTTP_CALLBACK_STATUS_SECURE_FAILURE,然后是lpvStatusInformation 指向DWORD,它是一个或多个的按位或组合 下列值。阅读more

但是,从一般的角度来看,我们可以理解 - 使用服务器的证书中的 CN 必须与请求中使用的站点 dns 名称相同。如果你在这里使用 localhost - 那么服务器证书的 CN 名称也必须是本地主机,否则你得到了最小的 WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID:

SSL 证书公用名(主机名字段)不正确,因为 例如,如果您输入 localhost 并且在 证书上写着 heilpraxis-einssein.de

如果没有出现此类错误,您可以使用 WinHttpSetOptionWINHTTP_OPTION_SECURITY_FLAGS。您需要考虑如何设置SECURITY_FLAG_IGNORE_CERT_CN_INVALID

允许在证书中使用无效的通用名称;也就是服务器 应用程序指定的名称与中的通用名称不匹配 证书。如果设置了此标志,则应用程序不会收到 WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID 回调。

但可以设置多个标志:

            ULONG flags = 
                SECURITY_FLAG_IGNORE_UNKNOWN_CA|
                SECURITY_FLAG_IGNORE_CERT_DATE_INVALID|
                SECURITY_FLAG_IGNORE_CERT_CN_INVALID|
                SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;

            WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &flags, sizeof(flags));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 2017-09-15
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2018-10-27
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多