ошибка 12175
это ERROR_WINHTTP_SECURE_FAILURE
.WinHttpSendRequest
объясняет, когда возникает эта ошибка и как получить дополнительную информацию о ней:
Одна или несколько ошибок были обнаружены в Secure Sockets Layer (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
, который является побитовой комбинацией ИЛИ одного или нескольких из следующих значений.прочитайте подробнее
однако и из общего представления мы можем понять - 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));