using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Linq; using System.Text; using System.IO; using System.Threading; namespace HPSocketCS { public class SSLAgent : TcpAgent { static int ObjectReferer = 0; static string SSLInitLock = "SSL初始化锁"; /// /// 验证模式 /// 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 SSLAgent() { Interlocked.Increment(ref ObjectReferer); } /// /// /// /// 验证模式 /// 证书文件 /// 私钥文件 /// 私钥密码(没有密码则为空) /// CA 证书文件或目录(单向验证或客户端可选) public SSLAgent(SSLVerifyMode _verifyModel, string _pemCertFile, string _pemKeyFile, string _keyPasswod, string _caPemCertFileOrPath) { Interlocked.Increment(ref ObjectReferer); this.VerifyMode = _verifyModel; this.PemCertFile = _pemCertFile; this.PemKeyFile = _pemKeyFile; this.KeyPasswod = _keyPasswod; this.CAPemCertFileOrPath = _caPemCertFileOrPath; //Initialize(); } ~SSLAgent() { //Uninitialize(); } protected override bool CreateListener() { if (IsCreate == true || pListener != IntPtr.Zero || pAgent != IntPtr.Zero) { return false; } pListener = Sdk.Create_HP_TcpAgentListener(); if (pListener == IntPtr.Zero) { return false; } pAgent = SSLSdk.Create_HP_SSLAgent(pListener); if (pAgent == IntPtr.Zero) { return false; } IsCreate = true; return true; } /// /// 初始化SSL环境 /// /// protected virtual bool Initialize() { lock (SSLInitLock) { //if (SSLSdk.HP_SSL_IsValid() == false) { PemCertFile = string.IsNullOrWhiteSpace(PemCertFile) ? null : PemCertFile; PemKeyFile = string.IsNullOrWhiteSpace(PemKeyFile) ? null : PemKeyFile; KeyPasswod = string.IsNullOrWhiteSpace(KeyPasswod) ? null : KeyPasswod; CAPemCertFileOrPath = string.IsNullOrWhiteSpace(CAPemCertFileOrPath) ? null : CAPemCertFileOrPath; var ret = SSLSdk.HP_SSLAgent_SetupSSLContext(pAgent, VerifyMode, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath); System.Diagnostics.Trace.WriteLine($"ssl Initialize : {ret}"); } return true; } } /// /// 反初始化SSL环境 /// protected virtual void Uninitialize() { if (Interlocked.Decrement(ref ObjectReferer) == 0 && pAgent != IntPtr.Zero) { SSLSdk.HP_SSLAgent_CleanupSSLContext(pAgent); } } /// /// 启动通讯组件 /// 启动完成后可开始连接远程服务器 /// /// 绑定地址 /// 是否异步 /// public new bool Start(string address, bool async = false) { Uninitialize(); bool ret = false; if (Initialize()) { ret = base.Start(address, async); } return ret; } public override void Destroy() { Stop(); if (pAgent != IntPtr.Zero) { SSLSdk.Destroy_HP_SSLAgent(pAgent); pAgent = IntPtr.Zero; } if (pListener != IntPtr.Zero) { Sdk.Destroy_HP_TcpAgentListener(pListener); pListener = IntPtr.Zero; } IsCreate = false; } /// /// 启动 SSL 握手 /// 当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手 /// /// /// public bool StartSSLHandShake(IntPtr connId) { return SSLSdk.HP_SSLAgent_StartSSLHandShake(pAgent, connId); } /// /// 获取或设置通信组件握手方式(默认:TRUE,自动握手) /// public bool AutoHandShake { get { return SSLSdk.HP_SSLAgent_IsSSLAutoHandShake(pAgent); } set { SSLSdk.HP_SSLAgent_SetSSLAutoHandShake(pAgent, value); } } } }