65.9K
CodeProject 正在变化。 阅读更多。
Home

CSslSocket - 支持 SSL/TLS 的 CSocket

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (11投票s)

2001年11月25日

2分钟阅读

viewsIcon

859428

downloadIcon

11152

带有 SSL/TLS 扩展的 CSocket 派生类

动机

在查看来自 平台 SDK(WebServer 和 WebClient)的 SSL 示例后,我发现利用 SSL/TLSWindows 中内置的功能会很有用。然而,这些示例不太易于使用 - 您可以从中学习 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);

参数 nSocketPortlpszSocketAddressCSocket 具有相同的参数。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 指定用户证书名称即可。

© . All rights reserved.