SslStream类获取SNI的值的方法(.NET Core2.1以上版本)

在.NET Core2.1以上版本的SslStream类中为AuthenticateAsServerAsync实例方法增加了一个重载

签名如下

public Task AuthenticateAsServerAsync (SslServerAuthenticationOptions sslServerAuthenticationOptions, CancellationToken cancellationToken = default);

其中重要的是SslServerAuthenticationOptions类型的参数, SslServerAuthenticationOptions类型有一个ServerCertificateSelectionCallback属性 ,属性的值是一个ServerCertificateSelectionCallback类型的委托

委托签名如下

public delegate X509Certificate ServerCertificateSelectionCallback(object sender, string hostName);

委托参数中的hostName就是SNI的值,当然必须在TLS连接请求存在SNI的时候,否则hostName的值是null;

示例如下

 1         SslStream sslStream;//假设已经创建SslStream类型但未调用AuthenticateAsServerAsync方法
 2 
 3 
 4 
 5             var options = new SslServerAuthenticationOptions();
 6 
 7 
 8 
 9             options.ServerCertificateSelectionCallback = (obj, hostName) =>
10 
11             {
12 
13                 //根据hostName的值选择证书返回
14 
15                 //例如
16 
17 
18 
19                 if (hostName == "baidu.com")
20 
21                 {
22 
23                     return new X509Certificate2("百度的证书文件路径");
24 
25                 }
26 
27                 else if (hostName == "bilibili.com")
28 
29                 {
30 
31                     return new X509Certificate2("b站的证书文件路径");
32 
33                 }
34 
35                 else
36 
37                 {
38 
39                     throw new ArgumentException();
40 
41                 }
42 
43             };
44 
45 
46 
47             sslStream.AuthenticateAsServerAsync(options);

 

posted @ 2020-10-09 18:25  FfD4edyo  阅读(341)  评论(0)    收藏  举报