Как разговаривать по SSL с клиента Windows MFC?

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

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

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

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

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

Спасибо,

только

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 496
6

Ответы 6

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

Спасибо - хорошая статья! Я бы предпочел решение, которое позволяет мне использовать код Microsoft, а не использовать OpenSSL. SChannels кажутся слишком низкоуровневыми ... Еще раз спасибо. Рони

ronys 18.12.2008 21:38

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

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

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

Спасибо за указатель - похоже, полезный инструментарий, хотя, возможно, для моего проекта это немного излишне. Кроме того, это лицензия «Открытая лицензия проекта кода (CPOL) 1.02», которая не входит в число одобренных OSI лицензий в opensource.org/licenses. Рони

ronys 19.12.2008 00:46

... Что, значит, использовать MFC можно, а вот бесплатную лицензию, не одобренную OSI, - нет? И поскольку это не совсем то, что вам нужно, а немного больше, это «излишество»? Если вам не нравятся ответы, не задавайте вопрос ...

Roel 19.12.2008 18:00

Прелесть Ultimate TCP / IP в том, что вам нужно компилировать только те части, которые вам нужны - в данном случае только поддержка HTTPS - ИМХО вряд ли переборщит.

Rob 19.12.2008 21:38

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

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

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

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

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

SSL В WinHTTP, msdn.microsoft.com/en-us/library/windows/desktop/…, объясняет основы SSL с WinHTTP и использование сертификатов.

Richard Chambers 13.08.2015 02:52

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

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

The Microsoft Win32 Internet Functions (exported from WinInet.dll) are not supported when run from a service or an Internet Information Server (IIS) application (also a service). This article discusses using the WinInet.dll in a service or in Internet Information Server applications.

Применимый исходный код, который я использую в своем приложении 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 ;
}

Другие вопросы по теме