cWinsock TLS/SSL 支持
概述
cWinsock 支持通过链式函数配置 TLS,实现加密 TCP 通信。内部已将 cAsyncSocket 替换为 cTlsSocket(严格超集,TLS 未启用时行为完全一致)。
链式函数
Tls — 客户端 TLS(无需证书)
客户端连接 TLS 服务器时使用,只需启用加密,无需本地证书。
vb
Public Function Tls() As cWinsock适用场景: 连接 wss:// 服务器、https:// 网站、TLS TCP 服务器等。
TlsCertFile — 证书文件模式
服务端 Listen 时出示证书,最常用方式。
vb
Public Function TlsCertFile( _
ByVal CertFile As String, _
Optional ByVal Password As String, _
Optional ByVal AlpnProtocols As String = "http/1.1") As cWinsock参数:
| 参数 | 类型 | 必要 | 说明 |
|---|---|---|---|
CertFile | String | 是 | 证书文件路径。PFX/P12 或 PEM 格式,PEM 支持用 | 分隔多文件 |
Password | String | 否 | 证书密码,PEM 无加密私钥时留空 |
AlpnProtocols | String | 否 | ALPN 协议协商,默认 "http/1.1" |
TlsCertSubject — Windows 证书存储模式
从 Windows 系统证书库查找证书。
vb
Public Function TlsCertSubject( _
ByVal CertSubject As String, _
Optional ByVal AlpnProtocols As String = "http/1.1") As cWinsockTlsCertMemory — 内存证书集合模式
高级用法,从内存中的 Collection 加载证书。
vb
Public Function TlsCertMemory( _
ByVal Certificates As Collection, _
ByVal PrivateKey As Collection, _
Optional ByVal AlpnProtocols As String = "http/1.1") As cWinsock新增事件
ServerCertificateVerify
客户端连接 TLS 服务器时,用于验证服务器证书。
vb
Event ServerCertificateVerify(Client As cWinsock, Issuers As Object, ByRef Confirmed As Boolean)Issuers:服务器证书链信息Confirmed:设为True信任证书,设为False拒绝连接- 默认行为:自动信任(
Confirmed = True)
使用示例
客户端 TLS 连接
vb
Dim ws As New cWinsock
ws.Tls.Connect "example.com", 443服务端 TLS 监听
vb
Dim svr As New cWinsock
svr.TlsCertFile("C:\certs\server.pfx", "password").Listen 443条件启用
vb
If Config.UseTLS Then
ws.Tls
End If
ws.Connect Config.Host, Config.Port链式配置
vb
Dim svr As New cWinsock
svr.TlsCertFile("cert.pem").Delimiter(vbCrLf).AutoHeartbeat = True
svr.Listen 9000同步 TLS 连接
vb
Dim ws As New cWinsock
ws.Tls
If ws.SyncConnect("example.com", 443, 5000) Then
' TLS 连接成功
End If证书验证(自定义)
vb
Private Sub m_oSocket_ServerCertificateVerify(Client As cWinsock, Issuers As Object, ByRef Confirmed As Boolean)
' 仅信任特定证书
If 检查证书是否可信 Then
Confirmed = True
Else
Confirmed = False
End If
End Sub证书来源说明
三种证书模式的详细介绍,参见 TLS 证书配置总览:
| 证书模式 | 详见 |
|---|---|
| TlsCertFile(证书文件) | 证书文件模式 |
| TlsCertSubject(Windows 证书存储) | Windows 证书存储模式 |
| TlsCertMemory(内存证书集合) | 内存证书集合模式 |
内部机制
TLS 模式枚举
vb
Private Enum EnumTlsMode
TlsNone ' 未启用(默认,纯 TCP)
TlsModeClient ' 客户端 TLS(Connect 时启用加密)
TlsModeCertFile ' 证书文件(Listen 时出示证书)
TlsModeSubject ' Windows 证书存储
TlsModeMemory ' 内存证书集合
End Enum核心替换
cAsyncSocket→cTlsSocket:所有New cAsyncSocket改为New cTlsSocketConnect:TLS 模式时传UseTls:=TrueListen:TLS 模式时先调用InitServerTls初始化证书AcceptFrom:参数类型改为cTlsSocket,Accept 传UseTls标志SyncConnect:TLS 模式时传UseTls:=TrueClose_:重置 TLS 状态
向后兼容
不调用任何 Tls 函数时,行为与改造前完全一致。cTlsSocket 在 TLS 未启用时,与 cAsyncSocket 行为完全相同。
注意事项
- UDP 不受影响:TLS 仅适用于 TCP,UDP 模式下 Tls 函数调用无效
- AcceptFrom 跨类访问:使用
TlsModeInternalFriend Property 读取父级 TLS 状态 - 编译依赖:项目需包含
cTlsSocket.cls及其依赖的 TLS 模块 - 向后兼容:不调用任何 Tls 函数时,行为与改造前完全一致
- 证书来源优先级:内存集合 > 证书文件 > Windows 证书存储