using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace HPSocketCS { public class SSLClient : TcpClient { /// /// 验证模式 /// public SSLVerifyMode VerifyMode { get; set; } /// /// 证书文件(客户端可选) /// public string PemCertFile { get; set; } /// /// 私钥文件(客户端可选) /// public string PemKeyFile { get; set; } /// /// 私钥密码(没有密码则为空) /// public string KeyPasswod { get; set; } /// /// CA 证书文件或目录(单向验证或客户端可选) /// public string CAPemCertFileOrPath { get; set; } public SSLClient() { } /// /// /// /// 验证模式 /// 证书文件(客户端可选) /// 私钥文件(客户端可选) /// 私钥密码(没有密码则为空) /// CA 证书文件或目录(单向验证或客户端可选) public SSLClient(SSLVerifyMode verifyModel, string pemCertFile, string pemKeyFile, string keyPasswod, string caPemCertFileOrPath) { this.VerifyMode = verifyModel; this.PemCertFile = pemCertFile; this.PemKeyFile = pemKeyFile; this.KeyPasswod = keyPasswod; this.CAPemCertFileOrPath = caPemCertFileOrPath; } protected override bool CreateListener() { if (IsCreate == true || pListener != IntPtr.Zero || pClient != IntPtr.Zero) { return false; } pListener = Sdk.Create_HP_TcpClientListener(); if (pListener == IntPtr.Zero) { return false; } pClient = SSLSdk.Create_HP_SSLClient(pListener); if (pClient == IntPtr.Zero) { return false; } IsCreate = true; return true; } /// /// 初始化SSL环境 /// /// public virtual bool Initialize() { if (pClient != IntPtr.Zero) { PemCertFile = string.IsNullOrWhiteSpace(PemCertFile) ? null : PemCertFile; PemKeyFile = string.IsNullOrWhiteSpace(PemKeyFile) ? null : PemKeyFile; KeyPasswod = string.IsNullOrWhiteSpace(KeyPasswod) ? null : KeyPasswod; CAPemCertFileOrPath = string.IsNullOrWhiteSpace(CAPemCertFileOrPath) ? null : CAPemCertFileOrPath; return SSLSdk.HP_SSLClient_SetupSSLContext(pClient, VerifyMode, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath); } return false; } /// /// 反初始化SSL环境 /// public virtual void Uninitialize() { if (pClient != IntPtr.Zero) { SSLSdk.HP_SSLClient_CleanupSSLContext(pClient); } } public override void Destroy() { Stop(); if (pClient != IntPtr.Zero) { SSLSdk.Destroy_HP_SSLClient(pClient); pClient = IntPtr.Zero; } if (pListener != IntPtr.Zero) { Sdk.Destroy_HP_TcpClientListener(pListener); pListener = IntPtr.Zero; } IsCreate = false; } /// /// 启动 SSL 握手 /// 当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手 /// /// /// public bool StartSSLHandShake() { return SSLSdk.HP_SSLClient_StartSSLHandShake(pClient); } /// /// 获取或设置通信组件握手方式(默认:TRUE,自动握手) /// public bool AutoHandShake { get { return SSLSdk.HP_SSLClient_IsSSLAutoHandShake(pClient); } set { SSLSdk.HP_SSLClient_SetSSLAutoHandShake(pClient, value); } } } }