Клиент OpenSSL WinINET

У меня есть рабочий клиент и сервер, который после завершения будет иметь действующий сертификат SSL.

На данный момент, в качестве средства тестирования, я просто отключаю необходимость проверки SSL в клиенте, добавляя флаги INTERNET_FLAG_IGNORE_CERT_CN_INVALID и SECURITY_FLAG_IGNORE_UNKNOWN_CA следующим образом:

HINTERNET hRequest = HttpOpenRequest(hConnection,
           "GET","index.html",
           NULL,NULL,NULL,
           INTERNET_FLAG_RELOAD|
           INTERNET_FLAG_EXISTING_CONNECT
           #ifdef  __HTTPS__
           | INTERNET_FLAG_SECURE |INTERNET_FLAG_IGNORE_CERT_CN_INVALID|SECURITY_FLAG_IGNORE_UNKNOWN_CA
           #endif
           ,
           dwContext);

У меня это отлично работает на моем ноутбуке. Сейчас пытаюсь использовать на своем ПК. точно такой же код. скопировал и вставил файлы (оба Visual Studio Professional 2008), теперь я получаю 12045 ошибку. что означает Invalid Certificate Authority

Я попытался отключить брандмауэр Windows, но ничего не вышло. оба компьютера подключены к одному роутеру

Есть идеи, что может вызвать это?

Спасибо!

РЕДАКТИРОВАТЬ В основном происходит то же, что описано здесь Microsoft, только эта статья предназначена для Windows CE


person La bla bla    schedule 28.12.2012    source источник
comment
скопировал и вставил файлы - какие файлы? __HTTPS__ определен в проекте клиентского ПК?   -  person CodeCaster    schedule 28.12.2012
comment
На данный момент это единственный исходный файл в проекте VS. Да, __HTTPS__ определен. Я видел это сейчас groups.google.com/forum /? fromgroups = #! topic /, но не знаю, имеет ли это какое-то отношение к этому, я новичок во всей этой штуке с WinAPI   -  person La bla bla    schedule 28.12.2012


Ответы (1)


Помогает ли это?

Если сертификат SSL сервера выпущен неизвестным или недействительным центром сертификации, WinInet HttpSendRequest API или MFC CInternetFile :: SendRequest завершится ошибкой 12045 (ERROR_INTERNET_INVALID_CA).

Я думаю, вам следует позвонить InternetSetOption() в запросе перед его отправкой, например, потому что _ 2_ flags не указывает SECURITY_FLAG_IGNORE_UNKNOWN_CA:

HINTERNET hRequest = HttpOpenRequest(hConnection,...

#ifdef  __HTTPS__
    DWORD dwFlags;
    DWORD dwBuffLen = sizeof(dwFlags);
    InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);

    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;

    InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags));
#endif

HttpSendRequest(hRequest,...
person CodeCaster    schedule 28.12.2012
comment
Спасибо за Ваш ответ. Я получаю сообщение об ошибке 12057, т.е. ERROR_WINHTTP_SECURE_CERT_REV_FAILED. Не знаю, что это означает, но если я сейчас работаю с ноутбука, он все равно работает оттуда, поэтому ошибок сервера нет - person La bla bla; 28.12.2012
comment
Как предлагается здесь, groups.google. ru / forum /? fromgroups = #! topic / Я добавил SECURITY_FLAG_IGNORE_REVOCATION в ваш код. теперь это работает. Спасибо! - person La bla bla; 28.12.2012
comment
но если я сейчас работаю с портативного компьютера - вы сгенерировали и / или доверяли сертификату сервера на портативном компьютере? Это объясняет, что вы не получаете ошибок на этой машине. В любом случае проверка отзыва сертификата отключена по умолчанию. Изменить: приятно, что вы это решили! :-) - person CodeCaster; 28.12.2012
comment
Я не помню, чтобы когда-либо доверял сертификату ни на одном компьютере. Но, по крайней мере, сейчас он работает. Надеюсь, как только мы перейдем к доверенному сертификату, проблем не возникнет. Большое спасибо! - person La bla bla; 28.12.2012