c# - 如何验证自签名证书

标签 c# certificate client-server sslstream

我会清楚地向您提供我的问题,以便您回答我

我有一个使用 SslStream 保护的客户端-服务器(套接字)连接,据我所知,使用 ssl 可以确保我的客户端只会连接到我的服务器

为此我必须向我的客户端添加一个功能来验证服务器认证并确保服务器是真实的(我的服务器)

但我真的不明白如何验证我的自签名证书并需要你的帮助

此致,并提前致谢

最佳答案

想象一下,如果证书不是自签名的 - 它是由受信任的证书颁发机构签名的。它起作用的原因是因为您的客户端设备——windows、mac、linux、iphone、android 设备已经拥有所有知名证书颁发机构的证书。当您建立连接时,操作系统会为您完成工作。它确保在连接期间发送给客户端的证书是由知名证书颁发机构签名的。这样做的唯一原因是因为客户端已经拥有所有知名证书颁发机构的证书。

如果您选择使用自签名证书 - 或由自签名证书颁发机构签名的证书 - 您必须完成这项工作,而不是操作系统。但是 - 任务基本相同 - 您需要验证连接期间发送给客户端的证书是否符合预期。并且您将需要使用与签名证书相同的策略 - 您的客户端必须预安装预期的证书(或证书链)。

您需要以某种方式、某种方式确保您的客户端已经拥有自签名证书。特别是证书中的所有公开信息。客户将没有私钥——因为那是……私有(private)的。然后,您可以将代码添加到您的应用程序,以验证在连接期间发送的证书的哈希值是否与预安装的证书的哈希值相匹配。

我注意到你以前问过类似的问题,你可能已经知道这一切了。这里还有一点:

只要您确保自签名证书的私钥绝对安全,任何人都无法伪造您的自签名证书。这是做不到的。如果有人尝试,他们将不得不生成一个与您的私钥不匹配的新私钥 - 因为他们不知道您的私钥,因为您保护了它的安全。

然后一切都崩溃了。如果他们有不同的私钥,他们将需要不同的公钥。这意味着他们将拥有不同的证书哈希。 并且您的应用已经知道正确的公钥和散列(如上所述),因此当他们尝试使用错误的公钥和散列进入时,您的应用将拒绝连接。这是您必须在应用程序中完成的部分。

如果他们尝试使用您的公钥和散列但使用不同的私钥,SSL 将不允许他们建立连接。

关于c# - 如何验证自签名证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12441449/

相关文章:

xcode - 此证书的颁发者无效

ios - 了解 iOS 配置文件

java - java客户端和c服务器之间的文件传输

c++ - Winsock2 select() 函数 : passing {0, 0} 作为超时参数

c# - 检测损坏的图像文件

c# - 使用 C# 将 UTC 转换为 IST

c# - 带锁的 QueueUserWorkItem 是否正确实现?

.net - WCF : "The private key is not present in the X.509 certificate"-error when connecting to soap service

c - 从客户端到服务器的文件传输

c# - 在 PostScript 中添加表单