【问题标题】:Can I use a self-signed SSL certificate for commercial purposes?我可以将自签名 SSL 证书用于商业目的吗?
【发布时间】:2011-07-30 17:46:13
【问题描述】:

我正在制作一个服务器客户端以使用 ssl 进行注册和登录过程。
(如果重要的话,这适用于 iphone)

我刚开始研究什么是 ssl 以及如何使用它,并且
看到过程中有一个可以购买或自签名的证书。

如果我在网络服务器中使用自签名证书,网络浏览器会提醒我知道证书是自签名的。
但是,如果我在带有 tcp(不是 http)的常规应用程序中使用自签名证书,特别是 iphone,会发生什么情况。

我只想注册/登录 信息(他们的密码)是安全的,
并希望使用自签名 证书就可以了 目的。但我也需要制作 确保这不会导致“不信任 证书 - 警报”类型的 在应用程序中使用时中断 除了网络浏览器。

  • 编辑

我了解“不信任证书警报”是说客户端不应信任此服务器。

但在我的情况下,客户端不需要对服务器进行身份验证。
服务器只需要以安全的方式获取客户端的密码。

谢谢

【问题讨论】:

  • 这个问题实际上没有任何意义。这个问题的简单答案可能是“是”,但需要更多上下文。你在写一个应用程序吗?如果是这样,您可以让它做您喜欢的事情:-) 您是否使用其他人的应用程序但想要您的证书 - 完全取决于应用程序。
  • @Rory 我正在制作服务器和客户端(哪个 iphone 应用程序)。并且想知道使用自签名认证对于安全角度和可用性角度来说很好
  • @Eugene - 对于这种类型的事情,你应该没问题。用户唯一不会得到的是一种确认证书信任级别的方法(例如,您可以在浏览器中使用签名证书),但根据您对@Piskvor 的评论,这听起来不像问题。
  • @Rory 感谢您的确认。我愿意接受你的评论,但只能给好评。
  • @Eugene - 为你修复了这个问题 - 将其移至答案:-)

标签: iphone ssl certificate


【解决方案1】:

当您使用 SSL 连接使用密码加密登录对话时,服务器向客户端发送公钥(以证书的形式),客户端生成一次性会话密钥,使用服务器的公钥,并将其发送到服务器。然后服务器可以解密会话密钥,因为它拥有私钥。

然后用户使用会话密钥加密他的密码并将其发送到服务器,服务器可以解密它,因为它知道会话密钥。

现在,如果没有 PKI,如果攻击者想要了解您的密码,他就可以欺骗服务器。他会以通常的方式向您发送他的公钥,然后您会生成会话密钥等,然后将您的密码发送给他他将能够解密因为你会在不知道你是否可以信任的情况下使用他的密钥。

PKI 通过要求将公钥作为证书分发来保护您免受此类攻击。如果您信任签署证书的 CA,您可以知道公钥确实属于服务器,并且使用它来加密您的密码是安全的。如果您不使用证书 - 或者如果您使用不受信任的证书 - 您通常不知道要将密码发送给谁。

您没有提供有关您自己的特定用例的足够信息来确定您是否可以使用自签名证书...例如:您可能有一个固定的证书,该证书由一些受信任的通道,并且您可以在开始 SSL 对话时检查是否使用了正确的证书。如果是这种情况,那么您的客户已经知道它具有正确的公钥并且不需要能够检查签名。不过,一般来说,您需要由受信任的 CA 签署的适当证书,否则您将没有安全性。

【讨论】:

  • 这很好地描述了整体情况。写得很好。
【解决方案2】:

使用自签名证书不会增加理论上的安全性,因为中间可能有人。此通信中的对应方(您的客户端和您的服务器)将没有关于谁在说话或收听的额外信息,而这种加密的目的是确保通信中只有两个参与者,并且确保通信的身份至少其中一个是已知的。

在您的情况下,密码不会安全地传送给您,因为您不知道它是否在途中通过了第三方。同样,用户也不知道他将密码发送给了谁。

在实践中,设置中间人攻击可能需要做一些工作,也许这个障碍是某种安全性,但与强迫用户接受安全警告但后果不明确的烦恼形成对比,以及确实存在“虚假安全感”的风险。

有些公司提供具有最低验证形式的免费证书(他们只会检查您是否“拥有”电子邮件地址 hostmaster@domain)。这样您也不必处理警告。

除非像 Piskvor 所说的那样,您有办法将证书或其指纹与应用程序打包在一起。

【讨论】:

  • 感谢您详细描述了为什么它会很危险。但是有一个问题,为什么将我的证书与应用程序打包会有所不同(我认为这对于 iphone - appstore 基础设施是可能的)。如果证书可以被中间人提取和使用,会出现同样的问题吗?我猜你的意思是完全控制内部网络中的客户端?
【解决方案3】:

回答你的问题:你可以,但你不应该

首先,仅将 SSL 用于身份验证根本不安全。身份验证过程可能会产生某种会话(例如 cookie),然后在没有加密的情况下传输。因此,会话可能会被窃取(请参阅Session hijacking)。

其次,使用自签名证书允许man-in-the-middle attacks。因此,有人可以窃取用户的密码,而他可能甚至都不会注意到。用户不知道客户端收到您的自签名证书时弹出的警报与攻击者使用自签名证书时弹出的警报之间的区别。

我的建议:不要使用自签名证书。当攻击发生时,对您和您的客户都不利。

【讨论】:

    【解决方案4】:

    开始回答 - 对于这种类型的事情,你应该没问题。用户唯一不会得到的是一种确认证书信任级别的方法(例如,您可以在浏览器中使用签名证书),但根据您对@Piskvor 的评论,这听起来不像问题:您没有为此使用它。

    【讨论】:

      【解决方案5】:

      这就是受信任的签名机构的全部意义——任何由其他人签名的东西都应该发出安全警报。所以,不,没有有用的方法来覆盖它(除非您可以控制客户端计算机 - 例如,用于公司内部站点的自签名证书,当您可以将自己的 CA 添加到客户端列表中时),或者网络浏览器或其他任何东西。

      使用自签名证书,用户如何知道证书是您的还是攻击者的?他不能。

      如果您完全控制进程的两端(服务器和客户端),您当然可以指示客户端始终信任“来自 Eugene 的带有 A01AABB546AC 指纹的证书”,但是您需要自己构建证书基础结构(到期/撤销)。

      【讨论】:

      • 啊,他(客户端)不必对我(服务器)进行身份验证。我只是想确保将客户的密码安全地转移给我。会有什么不同吗?
      • @Eugene:那么应该没问题 - 除非客户端无法验证他实际上是在与您的服务器还是其他人的服务器交谈。
      猜你喜欢
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2015-10-21
      • 1970-01-01
      相关资源
      最近更新 更多