2008-12-18 95 views
2

我有一個MFC應用程序,目前使用CAtlHttpClient查詢Web服務器的一些信息。如何從Windows MFC客戶端說SSL?

我想改變這一點,以便查詢通過使用SSL的服務器身份驗證安全地進行。

谷歌搜索顯示,微軟已經改變了他們支持這幾次的方式,例如,的WinInet,WinHTTP的,但對我的生活我無法弄清楚如何做上述MSVS 2005下

使用MFC

該應用程序使用C++,如果可能的話,我想避免將.Net拖入圖片。

感謝任何幫助,提示,建議或指針!

感謝,

ONY

回答

2

早在2002年我寫了針對Windows開發者雜誌的文章,展示瞭如何使用OpenSSL,爲MFC的CAsyncSocket的提供SSL。代碼和文章在這裏:http://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html並且可能對你有所幫助。你也可以使用微軟的SChannel做類似的事情,但是由於OpenSSL爲你做了一些緩衝,所以你需要做的只是將字節壓入它,直到你得到明文出來......

+0

謝謝 - 不錯的文章! 雖然我寧願有一個解決方案,但我可以利用微軟的代碼,而不是在OpenSSL中運行。 SChannels似乎有點太低級... 再次感謝。 Rony – ronys 2008-12-18 18:38:56

4

你可以看看極限的TCP/IP - 這是MS友好,可能會做你以後:

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

我使用這個工具包,它的很好。

+0

感謝指針 - 看起來像一個有用的工具包,雖然可能對我的項目有點矯枉過正。 此外,許可證是「代碼項目開放許可證(CPOL)1.02」,它不屬於http://opensource.org/licenses中OSI批准的許可證。 Rony – ronys 2008-12-18 21:46:16

+0

...什麼,所以使用MFC是好的,但是不是'OSI批准'的免費許可證不是?而且因爲它不能完全滿足你的需求,但又多了一點「過量」?如果你不喜歡答案,不要問這個問題... – Roel 2008-12-19 15:00:15

1

只需使用WINHTTP,這是一個偉大的API,並擁有所有你需要做的SSL通過HTTP(加上Vista的前進代理配置工作)

0

我使用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 ; 
}