假设我想编写 2 个控制台程序:一个客户端和一个服务器。我将创建自签名证书,将它们安装在客户端计算机(此处为受信任的 .cer)和服务器(此处为私钥 .pfx)上。我正在使用 c#。
如何将我的服务器控制台与证书绑定?似乎在 Web 服务器(例如 IIS)中可以安装证书,也就是说,这是服务器应用程序与特定证书的绑定。如何在没有 Web 服务器的情况下将证书与程序链接?我是否需要以某种方式考虑应用程序代码中将是 https 的事实?
如何在客户端控制台上检查证书?听说这个逻辑是用浏览器写的。以编程方式从存储中提取证书并规定与来自服务器本身的证书进行比较的逻辑,或者您可以通过 cmd 将程序与证书链接起来,操作系统会自行检查所有内容?
最近有一个帖子回答了这些问题 https://habr.com/ru/post/581740/
.NET 中的 TLS 协议由
System.Net.Security.SslStream
. 这个类实现了客户端和服务器端。MSDN上有详细的例子
在此示例中,在方法调用中使用了服务器证书
SslStream.AuthenticateAsServer
:在示例中,证书文件的路径作为命令行参数传递。.NET 中的证书由类
System.Security.Cryptography.X509Certificates.X509Certificate
(在示例中使用)和System.Security.Cryptography.X509Certificates.X509Certificate2
(由 Microsoft 推荐)表示。在 MSDN 示例中,证书是使用静态方法构造的
X509Certificate.CreateFromCertFile
。客户端通过调用
SslStream.AuthenticateAsClient
. 此方法验证服务器的证书并协商安全连接设置。验证服务器证书包括两个步骤。首先,.NET 内部类解析服务器发送的证书并检查基本错误 - 正确的语法、NotValidBefore/NotValidAfter 时间、目的、证书链完整性、服务器名称与证书中的名称匹配(服务器名称为作为参数传递给
AuthenticateAsClient
)。然后调用一个类型的委托RemoteCertificateValidationCallback
,它作为参数传递给客户端线程的构造函数SslStream
。我在开头引用的客户端示例使用了一个微不足道的回调。如果在检查服务器证书时发现任何错误,它将停止身份验证。AuthenticateAsServer
在服务器端和客户端完成该方法后,将建立通过 TLS 协议的安全连接AuthenticateAsClient
。该类
SslStream
提供了一个类型为 的接口Stream
。该方法用于发送数据SslStream.Write
,该方法用于接收它SslStream.Read
。所有加密/解密,以及必要时重新建立连接,都在SslStream
.