我尝试使用GET参数接收一些数据。 当我尝试从webadress获取数据时,它工作正常。 只是我将Web服务器更改为localhost,我将不会收到数据并收到错误12175
我必须更改什么才能使我的代码适用于Web连接和localhost测试?
当我在浏览器中输入localhost地址时,我会收到预期的结果。
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¶m=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
}
答案 0 :(得分:0)
错误12175
,这是ERROR_WINHTTP_SECURE_FAILURE
。 WinHttpSendRequest
解释了何时发生此错误以及如何获取有关此错误的更多信息:
在安全套接字层(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 。
对于未出现此类错误,可以将WinHttpSetOption
与WINHTTP_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));