我有一个MFC应用程序,目前使用CAtlHttpClient查询Web服务器的一些信息。如何从Windows MFC客户端说SSL?
我想改变这一点,以便查询通过使用SSL的服务器身份验证安全地进行。
谷歌搜索显示,微软已经改变了他们支持这几次的方式,例如,的WinInet,WinHTTP的,但对我的生活我无法弄清楚如何做上述MSVS 2005下
使用MFC该应用程序使用C++,如果可能的话,我想避免将.Net拖入图片。
感谢任何帮助,提示,建议或指针!
感谢,
ONY
我有一个MFC应用程序,目前使用CAtlHttpClient查询Web服务器的一些信息。如何从Windows MFC客户端说SSL?
我想改变这一点,以便查询通过使用SSL的服务器身份验证安全地进行。
谷歌搜索显示,微软已经改变了他们支持这几次的方式,例如,的WinInet,WinHTTP的,但对我的生活我无法弄清楚如何做上述MSVS 2005下
使用MFC该应用程序使用C++,如果可能的话,我想避免将.Net拖入图片。
感谢任何帮助,提示,建议或指针!
感谢,
ONY
早在2002年我写了针对Windows开发者杂志的文章,展示了如何使用OpenSSL,为MFC的CAsyncSocket的提供SSL。代码和文章在这里:http://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html并且可能对你有所帮助。你也可以使用微软的SChannel做类似的事情,但是由于OpenSSL为你做了一些缓冲,所以你需要做的只是将字节压入它,直到你得到明文出来......
你可以看看极限的TCP/IP - 这是MS友好,可能会做你以后:
http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx
我使用这个工具包,它的很好。
找到一个指向微软的一些示例代码可能适合该法案: http://msdn.microsoft.com/en-us/library/s2ya483s(VS.80).aspx
但是这个失败的AcquireCredentialsHandle,这将是我这个庄严的论坛的下一个问题......
关于使用什么在的libeay32.dll和ssleay32.dll文件来作为OpenSSL的的一部分:
只需使用WINHTTP,这是一个伟大的API,并拥有所有你需要做的SSL通过HTTP(加上Vista的前进代理配置工作)
我使用Visual Studio 2005的MFC应用程序具有访问小文件网站的功能。我正在使用WinINet
函数see the WinINet API reference in Microsoft Windows Dev Center,它提供了一组简单的函数,它们使用指定协议(HTTP,HTTPS,FTP等)的URL来访问网站以下拉小文件。
查看libcurl
网站上有一个引用此Microsoft技术说明,Article Id 238425 - INFO: WinInet Not Supported for Use in Services已被标记为2015年8月12日至2015年退休。文章摘要如下:
Microsoft Win32 Internet函数(从WinInet导出。dll)从服务或Internet信息运行时不支持 服务器(IIS)应用程序(也是服务)。本文讨论在服务或Internet信息服务器 应用程序中使用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 ;
}
谢谢 - 不错的文章! 虽然我宁愿有一个解决方案,但我可以利用微软的代码,而不是在OpenSSL中运行。 SChannels似乎有点太低级... 再次感谢。 Rony – ronys 2008-12-18 18:38:56