У меня есть приложение MFC, которое в настоящее время использует CAtlHttpClient для запроса некоторой информации на веб-сервере.
Я хотел бы изменить это так, чтобы запрос проходил безопасно, с аутентификацией сервера, с использованием SSL.
Поиск в Google показывает, что Microsoft несколько раз меняла способ поддержки этого, например WinInet, WinHTTP, но, хоть убей, я не могу понять, как это сделать, используя MFC в MSVS 2005.
Приложение написано на C++, и, если это вообще возможно, я бы не хотел перетаскивать .Net в картинку.
Любая помощь, подсказки, предложения или указатели с благодарностью принимаются!
Спасибо,
только





Еще в 2002 году я написал статью для журнала разработчиков Windows, в которой было показано, как использовать OpenSSL для предоставления SSL для CAsyncSocket MFC. Код и статья находятся здесь: http://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html и могут вам помочь. Вы также можете сделать что-то подобное, используя Microsoft SChannel, но это немного сложнее, поскольку OpenSSL выполняет некоторую буферизацию за вас, поэтому все, что вам нужно сделать, это вставить в него байты, пока вы не получить чистый текст ...
Вы можете взглянуть на Ultimate TCP / IP - он дружественен к MS и может делать то, что вам нужно:
http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx
Я использую этот инструментарий, и он очень хорош.
Спасибо за указатель - похоже, полезный инструментарий, хотя, возможно, для моего проекта это немного излишне. Кроме того, это лицензия «Открытая лицензия проекта кода (CPOL) 1.02», которая не входит в число одобренных OSI лицензий в opensource.org/licenses. Рони
... Что, значит, использовать MFC можно, а вот бесплатную лицензию, не одобренную OSI, - нет? И поскольку это не совсем то, что вам нужно, а немного больше, это «излишество»? Если вам не нравятся ответы, не задавайте вопрос ...
Прелесть Ultimate TCP / IP в том, что вам нужно компилировать только те части, которые вам нужны - в данном случае только поддержка HTTPS - ИМХО вряд ли переборщит.
Нашел указатель на пример кода Microsoft, который может соответствовать всем требованиям: http://msdn.microsoft.com/en-us/library/s2ya483s(VS.80).aspx
Однако это не удается на AcquireCredentialsHandle, что будет моим следующим вопросом на этом августовском форуме ...
Как насчет использования файлов libeay32.dll и ssleay32.dll, которые входят в состав OpenSSL:
Просто используйте WinHttp, это отличный API, в нем есть все, что вам нужно для SSL через HTTP (плюс работает с конфигурацией прокси Vista в будущем)
SSL В WinHTTP, msdn.microsoft.com/en-us/library/windows/desktop/…, объясняет основы SSL с WinHTTP и использование сертификатов.
Я использую 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 ;
}
Спасибо - хорошая статья! Я бы предпочел решение, которое позволяет мне использовать код Microsoft, а не использовать OpenSSL. SChannels кажутся слишком низкоуровневыми ... Еще раз спасибо. Рони