Как говорить по SSL с клиента Windows MFC? - PullRequest
2 голосов
/ 18 декабря 2008

У меня есть приложение MFC, которое в настоящее время использует CAtlHttpClient для запроса веб-сервера для получения некоторой информации.

Я бы хотел изменить это так, чтобы запрос проходил безопасно, с аутентификацией сервера, с использованием SSL.

Поиск в Google показывает, что Microsoft несколько раз меняла способ их поддержки, например, WinInet, WinHTTP, но я не могу понять, как это сделать с помощью MFC под MSVS 2005.

Приложение написано на C ++, и, если это вообще возможно, я бы хотел избежать перетаскивания .Net в изображение.

Любая помощь, советы, предложения или указатели с благодарностью!

Спасибо

оны

Ответы [ 6 ]

4 голосов
/ 18 декабря 2008

Вы можете взглянуть на Ultimate TCP / IP - он дружествен к MS и может делать то, что вам нужно:

http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx

Я использую этот инструментарий, и он очень хорош.

2 голосов
/ 19 декабря 2008

Найден указатель на пример кода Microsoft, который может соответствовать всем требованиям: http://msdn.microsoft.com/en-us/library/s2ya483s(VS.80).aspx

Однако это не работает на AcquireCredentialsHandle, который будет моим следующим вопросом на этом августовском форуме ...

2 голосов
/ 18 декабря 2008

В 2002 году я написал статью для журнала Windows Developer Magazine, в которой рассказывалось, как использовать OpenSSL для предоставления SSL для CAsyncSocket MFC. Код и статья здесь: http://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html и могут вам помочь. Вы также можете сделать что-то подобное, используя Microsoft SChannel, но это немного сложнее, так как OpenSSL выполняет некоторую буферизацию для вас, поэтому все, что вам нужно сделать, это нажать байтов в него, пока вы не получите чистый текст ...

1 голос
/ 30 декабря 2008

Просто используйте WinHttp, это отличный API и имеет все, что вам нужно для SSL через HTTP (плюс работает с настройкой прокси Vista в будущем)

0 голосов
/ 13 августа 2015

Я использую Visual Studio 2005 с приложением MFC, которое имеет функции для доступа к веб-сайту для небольшого файла. Я использую функции WinINet, см. Справку по WinINet API в Центре разработки Microsoft Windows , которая предоставляет простой набор функций для доступа к веб-сайту с помощью URL-адреса, который задает протокол (HTTP, HTTPS, FTP). и т. д.), чтобы раскрыть небольшой файл.

На сайте libcurl была ссылка на это Техническое примечание Microsoft, Идентификатор статьи 238425 - ИНФОРМАЦИЯ: WinInet не поддерживается для использования в службах , которая помечена как удаленная с 12 августа. 2015. Краткое содержание статьи:

Функции Microsoft Win32 Internet (экспортированные из WinInet.dll) не поддерживается при запуске из службы или интернет-информации Приложение сервера (IIS) (также услуга). Эта статья обсуждает использование WinInet.dll в службе или на информационном сервере Интернета приложения.

Применимый исходный код, который я использую в своем приложении MFC, имеет диалоговое окно, в котором используется URL-адрес типа HTTPS, к которому добавлена ​​дополнительная информация для создания полного URI, а затем перейдите на веб-сайт, чтобы получить полный маленький файл:

int GetFile (HINTERNET hOpen, TCHAR * szURL, BYTE  szTemp[4096])   
{
    DWORD dwSize;
    TCHAR szHead[15];
    HINTERNET  hConnect;

    szHead[0] = '\0';
    szTemp[0] = 0;

    // Opens a resource specified by a complete HTTP URL.
    if ( !(hConnect = InternetOpenUrl( hOpen, szURL, szHead, 15, INTERNET_FLAG_DONT_CACHE, 0)))
    {
        DWORD  dwlasterror = GetLastError();
        if (dwlasterror == ERROR_INTERNET_NAME_NOT_RESOLVED) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_NAME_NOT_RESOLVED - check LAN connectivity."));
        } else if (dwlasterror == ERROR_INTERNET_TIMEOUT) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_TIMEOUT - check LAN connectivity."));
        } else if (dwlasterror == ERROR_INTERNET_SERVER_UNREACHABLE) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_SERVER_UNREACHABLE - check LAN connectivity."));
        } else if (dwlasterror == ERROR_INTERNET_OPERATION_CANCELLED) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_OPERATION_CANCELLED - check LAN connectivity."));
        } else {
            CString msg;
            msg.Format (_T("Error: GetLastError() returned %d."), dwlasterror);
            AfxMessageBox (msg);
        }
        return -2;
    }

    // Reads data from a handle opened by the InternetOpenUrl, FtpOpenFile, or HttpOpenRequest function.
    if (InternetReadFile (hConnect, szTemp, 4096,  &dwSize) )
    {
        if (dwSize) {
            return dwSize;
        }
        return -3;
    }
    return -4;
}

int DownloadURLImage (TCHAR * szURL, BYTE  szTemp[4096])
{
    int result = -1;
    HINTERNET hInternet;

    // Initializes an application's use of the WinINet functions.
    hInternet= InternetOpen (_T("DeviceConfig"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL);
    if (hInternet) {
        // if open succeeded then get the file and close the handle as we be done.
        result = GetFile (hInternet, szURL, szTemp) ; 
        InternetCloseHandle(hInternet);
    }
    return result ;
}
0 голосов
/ 19 декабря 2008

Как насчет использования файлов libeay32.dll и ssleay32.dll , которые входят в состав OpenSSL :

https://code.google.com/p/openssl-for-windows/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...