如何从 Windows MFC 客户端使用 SSL?

Posted

技术标签:

【中文标题】如何从 Windows MFC 客户端使用 SSL?【英文标题】:How to speak SSL from a Windows MFC client? 【发布时间】:2008-12-18 16:41:14 【问题描述】:

我有一个 MFC 应用程序,它当前使用 CAtlHttpClient 向 Web 服务器查询一些信息。

我想更改此设置,以便查询安全地通过服务器身份验证,使用 SSL。

谷歌搜索显示,微软已经多次改变了他们支持这一点的方式,例如 WinInet、WinHTTP,但对于我来说,我无法弄清楚如何在 MSVS 2005 下使用 MFC 完成上述操作。

应用程序是 C++ 语言,如果可能的话,我想避免将 .Net 拖到图片中。

感谢任何帮助、提示、建议或指点!

谢谢,

奥尼

【问题讨论】:

【参考方案1】:

您可以看看 Ultimate TCP/IP - 它对 MS 友好,可能会满足您的需求:

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

我用这个工具包,非常好。

【讨论】:

感谢您的指点 - 看起来像一个有用的工具包,尽管对我的项目来说可能有点矫枉过正。此外,该许可证是“The Code Project Open License (CPOL) 1.02”,它不属于opensource.org/licenses 中 OSI 批准的许可证。罗尼 ... 什么,所以使用 MFC 是可以的,但不是“OSI 批准”的免费许可证不是吗?而且因为它并不能完全满足您的需要,而是有点“矫枉过正”?如果您不喜欢答案,请不要问问题... Ultimate TCP/IP 的美妙之处在于您只需要编译您想要的部分 - 在这种情况下只是 HTTPS 支持 - 恕我直言,这几乎不会矫枉过正。【参考方案2】:

找到了一个指向一些可能符合要求的 Microsoft 示例代码的指针: http://msdn.microsoft.com/en-us/library/s2ya483s(VS.80).aspx

然而,这在 AcquireCredentialsHandle 上失败了,这将是我在这个八月论坛上的下一个问题......

【讨论】:

【参考方案3】:

早在 2002 年,我为 Windows Developer Magazine 写了一篇文章,展示了如何使用 OpenSSL 为 MFC 的 CAsyncSocket 提供 SSL。代码和文章在这里:http://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html 并且可能对您有所帮助。您也可以使用 Microsoft 的 SChannel 做类似的事情,但它涉及更多一点,因为 OpenSSL 会为您做一些缓冲,所以您需要做的就是将字节推入其中直到你得到清晰的文本......

【讨论】:

谢谢 - 好文章!不过,我更喜欢允许我利用 Microsoft 代码的解决方案,而不是使用 OpenSSL。 SChannels 似乎有点太低级了......再次感谢。罗尼【参考方案4】:

只需使用 WinHttp,它是一个很棒的 AP​​I,并且拥有通过 HTTP 执行 SSL 所需的一切(并且可以与 Vista 的代理配置一起使用)

【讨论】:

SSL 在 WinHTTP 中,msdn.microsoft.com/en-us/library/windows/desktop/… 解释了 SSL 与 WinHTTP 的基础知识以及证书的使用。【参考方案5】:

如何使用 libeay32.dllssleay32.dll 文件作为 OpenSSL 的一部分:

https://code.google.com/p/openssl-for-windows/

【讨论】:

【参考方案6】:

我正在使用带有 MFC 应用程序的 Visual Studio 2005,该应用程序具有访问网站以获取小文件的功能。我正在使用WinINet 函数,see the WinINet API reference in Microsoft Windows Dev Center,它提供了一组简单的函数,使用 URL 访问网站,该 URL 指定协议(HTTP、HTTPS、FTP 等)以下载一个小文件。

libcurl 站点上查找此 Microsoft 技术说明 Article Id 238425 - INFO: WinInet Not Supported for Use in Services 的引用,该说明已于 2015 年 8 月 12 日标记为已停用。文章摘要是:

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 ;

【讨论】:

以上是关于如何从 Windows MFC 客户端使用 SSL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 extjs 的 SSL 调用 rest

win7 windows server 2008R2下 https SSL证书安装的搭配(搭配https ssl本地测试环境)

win7 windows server 2008R2下 https SSL证书安装的搭配(搭配https ssl本地测试环境)

如何在 Windows 窗体应用程序中显示 MFC 控件?

VC中MFC从哪里开始运行,MFC怎么调试

vc,mfc,api,windows编程,win32(sdk),gui学习的顺序是怎样的,本人迷茫中!!