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);
浙公网安备 33010602011771号