【问题标题】:How to validate self-signed certification如何验证自签名证书
【发布时间】:2012-09-08 14:49:58
【问题描述】:

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

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

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

但我真的不明白如何验证我的自签名证书并希望得到您的帮助

问候,并提前致谢

【问题讨论】:

  • 我认为这个 StackOverflow 问题会对您有所帮助:stackoverflow.com/questions/526711/…
  • 我不想添加异常并无论如何都要连接!因为让我实现 SslStream 的原因是我担心 MITM 攻击,所以我不能简单地忽略\或添加异常来连接
  • 我想要的是验证该服务器 100% 是我的真实服务器,而不是任何假服务器或第三方,以及如何确保我与客户一起发布的certificate.cer 未被编辑或替换
  • 好的。现在我明白了你的问题:-?我会为你研究更多...

标签: c# certificate client-server sslstream


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 那么你能告诉我我怎样才能买到便宜的吗?爸爸一年 12 美元的 ssl 认证好不好?我怎么能产生 CSR,我完全不知道跨度>
  • 对不起,没有。我仍在使用自签名证书,所以我无法帮助您。我想这些问题之前在这个网站上已经被问过 - 搜索是你的朋友:)
  • 感谢您的报道。这解释了如果您不在代码中验证证书,则可以通过自签名证书来实现中间人攻击,以及为什么使用 CA,您不必在代码中进行验证。太棒了,正是我想要的! :)
  • 很好的答案,我一直在寻找执行此操作的代码,但找不到,您能提供此答案的 C# 代码吗?
【解决方案2】:

为什么不直接使用受信任的廉价证书?

【讨论】:

  • 感谢您的关注 Torlan,我正在研究获得付费证书
  • 查看startssl.comletsencrypt.org 以获得免费的受信任证书。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
相关资源
最近更新 更多