【问题标题】:Authenticating a Server with Digital Signatures使用数字签名验证服务器
【发布时间】:2011-06-08 04:51:18
【问题描述】:

我了解如何通过数字签名实现不可否认性和完整性,但我还没有掌握身份验证。

我正在用 C# 开发一个客户端-服务器应用程序,它应该能够使用数字证书和数字签名进行身份验证。我知道如何检查签名的有效性和完整性(使用 SignedCms.CheckSignature()),但这如何验证所涉及的任何部分?

例如:

  1. 客户端向服务器请求数字签名,
  2. 客户端收到签名并进行验证,
  3. 如果验证成功,请继续。

客户端可能成为中间人攻击的受害者,并在第 2 步中接收到有效签名。验证会成功,但客户端不会与正确的服务器通信。

我错过了什么?

【问题讨论】:

    标签: c# authentication digital-signature digital-certificate x509certificate2


    【解决方案1】:

    只有在中间人拥有用于签署请求的私钥时,他们才能收到有效的签名。我认为您可能缺少的关键是更改经过数字签名的项目的任何方面都会使签名无效。中间的人可以重新提交请求,但是如果他们改变了,签名验证就会失败。

    【讨论】:

    • 如果中间人阻止了来自服务器的签名,并向客户端发送一个全新的数字签名,并带有由受信任的 CA 颁发的完全有效的证书,该怎么办?
    • 当客户端尝试使用预先存在的公钥来验证签名时,它会失败。如果客户接受了一个新的签名,那么当然,所有的赌注都没有了,所以你必须在使用信任链接受它之前确保一个证书是值得信赖的。
    【解决方案2】:

    您缺少对签名证书的信任。

    考虑 SSL 证书,它们具有指向 Windows(或任何操作系统)信任的根 CA 的签名路径。如果 MITM 提供自签名证书或由不受信任的 CA 生成的证书,则会被浏览器拒绝并显示警告。因此,只有当证书由您知道的 CA 颁发或链接到您知道的 CA 时,它才是可信的。

    对于自签名证书,它变得更加复杂,您需要安全地交换密钥指纹、序列号或其他常量标识符,并验证签名密钥实际上是您所期望的 - 这是自签名证书通常不应该的原因之一用于面向公众的网站或其他服务。

    因此,如果存在 MITM 攻击,并且原始计算机的签名被剥离,消息会更改,然后使用未知证书辞职,只要您根据您信任的东西检查签名证书的身份,那么您就会拒绝已辞职的消息。

    (实际上它变得更加复杂,但我希望你明白了)

    【讨论】:

    • 如果中间人阻止来自服务器的签名,并向客户端发送一个全新的数字签名,并带有由受信任的 CA 颁发的完全有效的证书,该怎么办?
    • 这变得更有趣了。在 SSL 中,您应该检查证书名称以确保它可以处理您要连接的地址。您依赖 SSL CA 确保他们已检查证书是否颁发给拥有该 FQDN 的人。然后会发布撤销列表,以防万一出现问题。在其他情况下,您将查看机器名称,可能还有会更改的证书指纹,或者验证整个链,如果证书是由另一个 CA 颁发的,这将是不同的。告诉你我简化了它:)
    • 如果我理解得很好,关于非 SSL 环境的方面意味着客户端已经拥有关于服务器的正确信息(例如指纹。如果我已经有了,我只能判断它是否改变了存储的正确指纹。)如果这是客户端第一次连接到服务器,并且没有以前的可信信息可以比较,会发生什么?
    • 那你就什么都不知道了,这就是为什么你需要带外获取信息。
    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 2014-12-10
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多