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);
}
}
}
}