signalr core客户端通过ssl连接服务的方式

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.keycertificate.cer。因此建议执行OpenSSL命令前使用cd命令移动到合适的文件夹
如:

> d:
> cd d:\temp

生成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();
posted @ 2020-05-15 18:31  chiikin  阅读(468)  评论(0编辑  收藏  举报