使用SignalR 的客户端去发送消息给使用 https 部署的站点,官方文档目前并没有详细的教程,所以在此记录下步骤:
使用管理员身份打开cmd 窗口,选择一个整数保存文件夹的地址,切换到对应的文件夹,然后执行以下步骤:
(一) 生成证书文件
1. openssl genrsa -out test.key 1024

2. openssl req -new -x509 -key test.key -out test.cer -days 365 -subj /CN=10.158.229.20
注:CN=xxx 这里可以填写部署网站的域名或者IP地址

3. openssl pkcs12 -export -out test.pfx -inkey test.key -in test.cer
注:生成了私钥文件 test.pfx, 这一步需要输入密码,密码会在导入IIS的时候使用

在以上步骤完成之后,生成如下几个文件, test.cer, test.key, test.pfx:

4. 添加到证书管理的可信任证书节点中区,这一步非常重要,如果不添加,就会导致SignalR无法正常访问
4.1. 运行–>输入mmc

4.2. File 中打开证书管理器

4.3. 在可信任根证书的节点右键导入证书


以上工作便完成了证书的创建和添加
(二)接下来开始部署IIS 站点:
1. 在IIS 管理其中选择 服务端证书

2. 选择导入,找到对应的 .pfx 证书,输入密码后,确认导入

3. 在自己的站点绑定对应的 SSL 证书

完成以上工作后,一个https 站点就已经完成
测试Demo:
客户端:
1 using Microsoft.AspNet.SignalR.Client;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Security.Cryptography.X509Certificates;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 namespace SignalR_cli
10 {
11 class Program
12 {
13 static HubConnection hubConnection = null;
14 static IHubProxy proxy = null;
15 static void Main(string[] args)
16 {
17 //这里连接使用OpenSSL 生成的证书部署的 https 站点
18 hubConnection = new HubConnection("https://10.158.229.20:443/");
19 //var hubConnection = new HubConnection("http://10.158.229.20:8081/");
20 //请求的时候一定带上对应站点部署的证书
21 hubConnection.AddClientCertificate(X509Certificate.CreateFromSignedFile(@"E:\cer_demo\myself.cer"));
22 proxy = hubConnection.CreateHubProxy("ChatHub");
23 hubConnection.Start();
24 Console.WriteLine((int)hubConnection.State);
25 while (true)
26 {
27 try
28 {
29 Console.WriteLine("Input:");
30 var msg = Console.ReadLine();
31 Go(msg);//异步发送消息就好了
32 }
33 catch (Exception e)
34 {
35 Console.WriteLine(e.Message);
36 }
37 }
38 }
39 static async Task Go(string msg)
40 {
41 await proxy.Invoke("Send", "userCenter", msg);
42 }
43 }
44 }
服务端:参考的官方文档

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using Microsoft.AspNet.SignalR;
6
7 namespace Web_SignalR
8 {
9 public class ChatHub : Hub
10 {
11 public void Send(string name, string message)
12 {
13 Clients.All.broadcastMessage(name, message);
14 }
15 }
16 }
1 using System;
2 using System.Threading.Tasks;
3 using Microsoft.Owin;
4 using Owin;
5
6 [assembly: OwinStartup(typeof(Web_SignalR.Startup))]
7
8 namespace Web_SignalR
9 {
10 public class Startup
11 {
12 public void Configuration(IAppBuilder app)
13 {
14 // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
15 app.MapSignalR();
16 }
17 }
18 }
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>SignalR Simple Chat</title>
5 <style type="text/css">
6 .container {
7 background-color: #99CCFF;
8 border: thick solid #808080;
9 padding: 20px;
10 margin: 20px;
11 }
12 </style>
13 </head>
14 <body>
15 <div class="container">
16 <input type="text" id="message" />
17 <input type="button" id="sendmessage" value="Send" />
18 <input type="hidden" id="displayname" />
19 <ul id="discussion"></ul>
20 </div>
21 <!--Script references. -->
22 <!--Reference the jQuery library. -->
23 <script src="Scripts/jquery-3.3.1.min.js"></script>
24 <!--Reference the SignalR library. -->
25 <script src="Scripts/jquery.signalR-2.2.2.min.js"></script>
26 <!--Reference the autogenerated SignalR hub script. -->
27 <script src="signalr/hubs"></script>
28 <!--Add script to update the page and send messages.-->
29 <script type="text/javascript">
30 $(function () {
31 // Declare a proxy to reference the hub.
32 var chat = $.connection.chatHub;
33 // Create a function that the hub can call to broadcast messages.
34 chat.client.broadcastMessage = function (name, message) {
35 // Html encode display name and message.
36 var encodedName = $('<div />').text(name).html();
37 var encodedMsg = $('<div />').text(message).html();
38 // Add the message to the page.
39 $('#discussion').append('<li><strong>' + encodedName
40 + '</strong>: ' + encodedMsg + '</li>');
41 };
42 // Get the user name and store it to prepend to messages.
43 $('#displayname').val("test");
44 // Set initial focus to message input box.
45 $('#message').focus();
46 // Start the connection.
47 $.connection.hub.start().done(function () {
48 $('#sendmessage').click(function () {
49 // Call the Send method on the hub.
50 chat.server.send($('#displayname').val(), $('#message').val());
51 // Clear text box and reset focus for next comment.
52 $('#message').val('').focus();
53 });
54 });
55 });
56 </script>
57 </body>
58 </html>
效果演示:

转载请注明:SuperIT » IIS 使用OpenSSL 生成的自签名证书,然后使用SingalR 客户端访问Https 站点通信

