signalr core客户端通过ssl连接服务的方式
生成自签证的证书
下载地址: https://slproweb.com/products/Win32OpenSSL.html
下载安装windows版本并安装
安装好后进入安装目录,找到start.bat
双击执行打开cmd命令行,打开的命令窗口设置好了环境变量,可以使用OpenSSL
命令。
执行以下命令生成证书
> openssl
> req -newkey rsa:2048 -nodes -keyout certificate.key -x509 -days 365 -out certificate.cer
根据命令提示行输入信息后在当前目录下生成certificate.key
和certificate.cer
。因此建议执行OpenSSL命令前使用cd
命令移动到合适的文件夹
如:
> d:
> cd d: emp
生成pfx文件
pkcs12 -export -in certificate.cer -inkey certificate.key -out certificate.pfx
根据提示输入密码即可。
修改signalr服务的配置
修改appsetting.json
{
"Kestrel": {
"Endpoints": {
//"Http": {
// "Url": "http://*:5110"
//},
"Https": {
"Url": "https://*:5111",
"Certificate": {
"Path": "socialnetwork.pfx",
"Password": "Qwer123@BN"
}
}
},
}
}
注意以上配置针对Kestrel服务器。如果使用iis承载服务则为iis配置证书。
客户端配置
客户端项目的根目录自签证的证书certificate.cer
,并设置该文件的属性"复制到输出目录"的值为"始终复制"
客户端连接服务器时判断服务器发送的证书是否配对。此代码在客户端可信的情况下可有保证证书没有被中间人篡改。
var connection = new HubConnectionBuilder()
.WithUrl("https://localhost:5001/chathbu", options=> {
var fileInfo = new FileInfo("certificate.cer");
X509Certificate2 x509Certificate = new X509Certificate2(fileInfo.FullName);
//针对https连接的ssl证书验证,此配置必须
options.HttpMessageHandlerFactory = (msgHandler) =>
{
if (msgHandler is HttpClientHandler httpClientHandler)
{
httpClientHandler.ServerCertificateCustomValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
{
return x509Certificate.Equals(certificate);//判断服务器的公开证书是否和客户端自带的证书相同
};
}
return msgHandler;
};
//针对websocket连接的ssl证书验证,使用websocket连接时必须配置
options.WebSocketConfiguration = (websocketOption) => {
websocketOption.RemoteCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => {
return x509Certificate.Equals(certificate);//判断服务器的公开证书是否和客户端自带的证书相同
};
};
})
.Build();