CSslSocket - 支持 SSL/TLS 的 CSocket






4.60/5 (11投票s)
2001年11月25日
2分钟阅读

859428

11152
带有 SSL/TLS 扩展的 CSocket 派生类
动机
在查看来自 平台 SDK(WebServer 和 WebClient)的 SSL 示例后,我发现利用 SSL/TLS 在 Windows 中内置的功能会很有用。然而,这些示例不太易于使用 - 您可以从中学习 SSL/TLS 在 Windows 中的工作方式,但将其调整到不同的应用程序并不容易。
解决方案描述
我相信每个人都熟悉 MFC 中的 CSocket
,并且见过 CHATTER / CHATSRVR 示例 - 这就是我开始的地方 - 我的想法是从 CSocket
派生 CSslSocket
并用 SSL 功能扩展它。
这意味着 CSslSocket
的工作方式与 CSocket
相同,并且在 Create()
和 Listen()
方法的声明中只有一些小的差异
BOOL Create( UINT nSocketPort = 443, LPCTSTR lpszSocketAddress = NULL, const TCHAR *szCertName = NULL, BOOL bMachineStore = FALSE, DWORD dwProtocol = 0); BOOL Listen( int nConnectionBacklog = 5, BOOL bAuthClient = FALSE);
参数 nSocketPort
、lpszSocketAddress
与 CSocket
具有相同的参数。SSL/TLS 是基于流的协议,因此您无法像 CSocket
那样在此方法中指定 SOCK_DGRAM
。但是,您可以指定证书名称(您必须为服务器端拥有证书)、证书存储和首选协议(请参阅 SCHANNEL_CRED)。客户端证书不是必需的,但您可以强制 SSL 引擎要求它。在这种情况下,在调用 Listen()
方法时将 bAuthClient
设置为 TRUE。
您可以在文章开头指定的位置找到有关 SSL/TLS 和 Schannel 的更多信息。
用法
您可以像使用 CSocket
一样使用 CSslSocket
,直接使用它,或者从 CSslSocket
派生您自己的类并覆盖所需的 方法。请参阅与本文一起提供的修改后的示例。
演示程序
在压缩文件中,有 Microsoft CHATTER / CHATSRVR 的修改后的示例,用于演示 CSslSocket
的使用和工作。修改很小 - 只是用 CSslSocekt
替换了 CSocket
,并且有代码传递适当的参数给 CSslSocket
类。您需要一个或两个证书来测试我的类。最简单的方法是从 Microsoft 安装证书服务,并通过 证书服务 提供的 Web 表单为客户端和服务器身份请求证书(您需要 Windows NT/2000 服务器),或者您也可以使用 OpenSSL。然后,只需在第一个对话框窗口中为 CHATSRVR 指定服务器证书名称,为 CHATTER 指定用户证书名称即可。