我有一个 MFC 应用程序,它当前使用 CAtlHttpClient 来查询 Web 服务器以获取一些信息。
我想更改它,以便查询安全地通过服务器身份验证,使用 SSL。
谷歌搜索显示微软已经多次改变了他们支持这一点的方式,例如 WinInet、WinHTTP,但对于我来说,我无法弄清楚如何在 MSVS 2005 下使用 MFC 来完成上述操作。
该应用程序使用 C++,如果可能的话,我想避免将 .Net 拖入图片中。
任何帮助、提示、建议或指点都将不胜感激!
谢谢,
只
你可以看看 Ultimate TCP/IP - 它对 MS 很友好,可能会做你想要的:
http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx
我使用这个工具包,它非常好。
早在 2002 年,我为 Windows Developer Magazine 写了一篇文章,展示了如何使用 OpenSSL 为 MFC 的 CAsyncSocket 提供 SSL。代码和文章在这里:http ://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html可能对你有帮助。你也可以使用微软的 SChannel 做类似的事情,但它是涉及更多一点,因为 OpenSSL 会为您做一些缓冲,所以您需要做的就是将字节推入其中,直到您获得明文...
找到了一些可能符合要求的 Microsoft 示例代码的指针:http: //msdn.microsoft.com/en-us/library/s2ya483s (VS.80).aspx
然而,这在 AcquireCredentialsHandle 上失败了,这将是我对这个八月论坛的下一个问题......
只需使用 WinHttp,它是一个很棒的 API,并且拥有通过 HTTP 执行 SSL 所需的一切(此外还可以与 Vista 的代理配置一起使用)
如何使用作为OpenSSL一部分的libeay32.dll和ssleay32.dll文件:
我正在使用带有 MFC 应用程序的 Visual Studio 2005,该应用程序具有访问网站以获取小文件的功能。我正在使用这些WinINet
函数,请参阅 Microsoft Windows Dev Center 中的 WinINet API 参考,它提供了一组简单的函数,这些函数使用 URL 访问网站,该 URL 指定协议(HTTP、HTTPS、FTP 等)以下拉一个小文件。
在libcurl
站点上查看此 Microsoft 技术说明,文章 ID 238425 - 信息:WinInet 不支持在服务中使用,已标记为自 2015 年 8 月 12 日起停用。文章摘要如下:
从服务或 Internet 信息服务器 (IIS) 应用程序(也是服务)运行时,不支持 Microsoft Win32 Internet 函数(从 WinInet.dll 导出)。本文讨论在服务或 Internet Information Server 应用程序中使用 WinInet.dll。
我在 MFC 应用程序中使用的适用源代码有一个对话框,该对话框使用 HTTPS 类型的 URL,向其附加附加信息以构建完整的 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 ;
}