2008-12-18 100 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 ; 
}