【问题标题】:Server Identification - SSL or "Manual"服务器标识 - SSL 或“手动”
【发布时间】:2015-10-16 09:33:26
【问题描述】:

在我的应用程序中,我想检查我连接的服务器是否可信。我没有使用需要证书费用的 SSL,而是考虑创建自己的身份检查,在连接时向服务器发送随机字符串。服务器将使用硬编码的私钥对字符串进行 rsa 加密并将结果发回。然后,客户端应用程序将使用硬编码的公钥解密结果(它只有公钥,没有私钥)。如果它发送的字符串和它解密的字符串匹配,则服务器的身份将被证明,并且 tcp 通信将使用 AES 加密(在服务器身份被证明后,AES 密钥以 rsa 加密格式传输)。

问题:

  1. 这种方法可行吗?如果可行,缺点在哪里? (除了我必须保密私钥,显然)
  2. 在这种情况下,将 SSL 与购买的证书一起使用会获得什么优势?
  3. 在这种情况下,自签名 SSL 证书是否也足够?我计划公开提供该服务。

【问题讨论】:

  • 证书的成本可以忽略不计或为零。推出自己的解决方案并出错的代价可能是巨大的。
  • @EJP 我知道你来自哪里。所以最好的办法是让客户端连接到重定向到我的服务器的域,然后从服务器端发送该域的证书,对吗?如果是,使用自签名证书进行开发是否好,当我上线时,从 Comodo 或 Thawte 等受信任的公司购买证书?

标签: ssl encryption cryptography


【解决方案1】:

我想检查我连接的服务器是否可信。

您的方法和使用 SSL 的方法都不能提供有关服务器可信度的任何信息,而只能提供一种识别服务器的方法,即确保您正在与预期的服务器通信。服务器仍然可能被黑客入侵并提供恶意软件,因此您不应该仅根据身份来信任它。

我考虑过创建自己的身份检查,在连接时向服务器发送一个随机字符串 ... rsa 加密 ... 硬编码私钥 ... 硬编码公钥 ...

您实际上是在尝试通过证书固定来重新发明 TLS。 TLS 不需要从公共 CA 购买证书。只要客户端事先知道预期的证书或公钥,即在连接之前,您就可以简单地创建自签名证书。使用由公共 CA 签名而不是自签名的证书的要点是,它不能扩展以将世界上的每个证书都安装到客户端浏览器/操作系统中,但它可以扩展为具有一些信任锚(根 CA)已安装。

有关如何将 TLS 与证书/公钥固定在此 page at OWASP 的更多信息,其中甚至包括各种语言的代码示例。

【讨论】:

    【解决方案2】:

    我建议您使用 TLS。随着时间的推移,已经发现并修复了 TLS 中的错误。从您自己的设计开始并假设您不会犯类似的错误是一个很大的风险。

    您可以免费创建自己的服务器证书,尤其是当您将服务器公钥嵌入客户端时,因为您不依赖公共 CA 来验证服务器的身份。

    您还通过使用私钥加密和公钥解密引入了一个弱点,这不是 RSA 的设计目的(public 密钥用于加密)。假设这很好,这是另一个很大的风险。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2021-10-18
      • 2015-08-17
      相关资源
      最近更新 更多