我有一個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