C# 如何验证自签名证书

C# 如何验证自签名证书,c#,certificate,client-server,sslstream,C#,Certificate,Client Server,Sslstream,我会清楚地告诉你我的问题,这样你就可以回答我了 我有一个客户端-服务器(套接字)连接,我使用SslStream保护该连接,并且我知道使用ssl可以确保我的客户端只连接到我的服务器 要做到这一点,我必须向我的客户端添加一个函数来验证服务器认证,并确保服务器是真实的(我的服务器) 但我真的不明白,我怎么能验证我的自签名证书并需要你的帮助呢 问候您,并提前向您致谢想象一下,如果证书不是自签名的,那么它是由受信任的证书颁发机构签名的。它之所以能够工作是因为您的客户端设备——windows、mac、lin

我会清楚地告诉你我的问题,这样你就可以回答我了

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

要做到这一点,我必须向我的客户端添加一个函数来验证服务器认证,并确保服务器是真实的(我的服务器)

但我真的不明白,我怎么能验证我的自签名证书并需要你的帮助呢


问候您,并提前向您致谢

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

如果选择使用自签名证书或由自签名证书颁发机构签名的证书,则必须执行此工作,而不是使用操作系统。但是-任务基本相同-您需要验证连接期间发送到客户端的证书是否与预期相符。您需要使用与签名证书相同的策略—您的客户端必须预先安装预期的证书(或证书链)

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

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

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

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


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

为什么不使用廉价的可信证书?

这将帮助您:我认为这个StackOverflow问题将帮助您:我不希望添加异常和连接!因为让我实现SslStream的原因是我担心MITM攻击,所以我不能简单地忽略\或添加异常以进行连接我想要的是验证此服务器100%是我的真实服务器,而不是任何虚假服务器或第三方,以及如何确保我与客户一起发布的certification.cer未被编辑或替换。现在我明白你的问题了:-?我会为你做更多的研究……那么你能给我提供一个便宜的证书吗,go daddy 12美元一年的ssl认证是一个好的证书吗?还有我如何生成CSR我对此一无所知对不起,不。我仍然在使用自签名证书,所以我无法帮你。我想这些问题以前在这个网站上被问过——搜索是你的朋友:)谢谢你的评论。这解释了由于自签名证书可以实现的中间人攻击,如果您不验证代码中的证书以及为什么使用CA,则不必在代码中验证。太棒了,正是我想要的!:)很好的答案,我一直在寻找一个代码来做这件事,但我找不到它,你能为这个答案提供一个C#代码吗?谢谢你的关注,托兰,我只是在研究获得付费证书,或者免费的可信证书。