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

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

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

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

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

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

谢谢,

奥尼

【问题讨论】:

    标签: c++ windows mfc ssl https


    【解决方案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 的代理配置一起使用)

      【讨论】:

      【解决方案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 ;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-15
          • 2010-11-03
          相关资源
          最近更新 更多