2013-10-12 3 views
3

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

Более конкретно, я получаю ошибку 0x00002F8F от WinHttpSendRequest, которая является ERROR_INTERNET_DECODING_FAILED (что указывает мне, что это ошибка сертификата). Я импортировал сертификат на эту машину и могу вытащить страницу в IE без ошибки сертификата.

The code I am using is here.

TLDR: Как использовать WinHTTP с самоподписывающемуся серт?

ответ

6

Для WinHTTP, чтобы принять/разрешить ошибки проверки SSL, вы должны сначала сделать запрос и разрешить ему сбой, а затем отключить проверки безопасности и повторить операцию над дескриптором запроса. Что-то вдоль линий:

// Certain circumstances dictate that we may need to loop on WinHttpSendRequest 
// hence the do/while 
do 
{ 
    retry = false; 
    result = NO_ERROR; 

    // no retry on success, possible retry on failure 
    if(WinHttpSendRequest(
     mHRequest, 
     WINHTTP_NO_ADDITIONAL_HEADERS, 
     0, 
     optionalData, 
     optionalLength, 
     totalLength, 
     NULL 
     ) == FALSE) 
    { 
     result = GetLastError(); 

     // (1) If you want to allow SSL certificate errors and continue 
     // with the connection, you must allow and initial failure and then 
     // reset the security flags. From: "HOWTO: Handle Invalid Certificate 
     // Authority Error with WinInet" 
     // http://support.microsoft.com/default.aspx?scid=kb;EN-US;182888 
     if(result == ERROR_WINHTTP_SECURE_FAILURE) 
     { 
      DWORD dwFlags = 
       SECURITY_FLAG_IGNORE_UNKNOWN_CA | 
       SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE | 
       SECURITY_FLAG_IGNORE_CERT_CN_INVALID | 
       SECURITY_FLAG_IGNORE_CERT_DATE_INVALID; 

      if(WinHttpSetOption(
       mHRequest, 
       WINHTTP_OPTION_SECURITY_FLAGS, 
       &dwFlags, 
       sizeof(dwFlags))) 
      { 
       retry = true; 
      } 
     } 
     // (2) Negotiate authorization handshakes may return this error 
     // and require multiple attempts 
     // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383144%28v=vs.85%29.aspx 
     else if(result == ERROR_WINHTTP_RESEND_REQUEST) 
     { 
      retry = true; 
     } 
    } 
} while(retry); 
+0

межжала, WinHTTP и WinInet может быть ближе, чем я, хотя они были ... – ixe013

+0

я просто ударилась головой против именно этой проблемы, отказываясь верить, что это глупо повторение необходимо. И действительно, это возможно: 1. получить дескриптор сеанса с WinHttpOpen 2. получить дескриптор соединения с помощью WinHttpConnect. 3. Получить запрос с помощью WinHttpOpenRequest (используйте WINHTTP_FLAG_SECURE, чтобы включить TLS. Это НЕ тот же набор флагов, что и WINHTTP_OPTION_SECURITY_FLAGS). 4. Используйте WinHttpSetOption, как описано выше, в обработчике полученного запроса. 5. WinHttpSendRequest для отправки запроса. – paradoxon

Смежные вопросы