我正在构建一个客户端应用程序,它将使用第三方服务提供商提供的 Web 服务应用程序。该服务使用未经受信任的证书颁发机构签名的 HTTPS URL 公开。
在当前情况下使用他们的服务是否安全?请注意,我们知道服务提供商公司,并且我们与他们签订了业务协议。
我正在构建一个客户端应用程序,它将使用第三方服务提供商提供的 Web 服务应用程序。该服务使用未经受信任的证书颁发机构签名的 HTTPS URL 公开。
在当前情况下使用他们的服务是否安全?请注意,我们知道服务提供商公司,并且我们与他们签订了业务协议。
如果您固定他们的证书,您可以安全地使用它。这增加了维护和部署的复杂性,但它确实提高了安全性。
如果你不这样做,那么这取决于他们如何建立他们的信任链:如果他们只使用自签名证书,那么你就不走运并且不能安全地使用他们的服务。如果他们只使用私有 CA,您仍然可以导入他们的 CA 并信任它。
总的来说,我建议您实施证书(或根)固定。
编辑@LieRyan 发表了一个很好的评论,我想在此发表评论。
在某些配置中,固定证书需要您将其添加到机器的根锚点列表中。例如,如果您在 Windows 上使用 IIS 来托管您的应用程序,则需要这样做。
现在,根据证书的生成方式,这可能是也可能不是问题。具体来说:如果证书确实具有“密钥使用”属性并且如果该属性没有列出“证书签名”,那么它可以安全地使用,因为它不能用于签署其他证书(细节有点复杂,但这是最重要的)。
如果证书没有“密钥使用”属性,或者该属性具有“证书签名”,那么它可能会导致由该证书签名的其他证书被操作系统信任。如果您实施了证书固定,这对您的应用程序来说应该不是问题(因为固定会阻止使用其他有效证书),但它可能适用于操作系统的其他部分。
在当前情况下使用他们的服务是否安全?
这是一个加载的问题。让我分解一下:
我能否以任何第三方无法拦截的方式安全地与他们通信?
是的你可以。但是,您需要手动执行密钥交换仪式和身份验证,而不是依赖 CA 来执行此操作。例如,可以通过让来自每家公司的受信任代表定期开会以交换识别信息和交换密钥材料(证书)来实现这一点。您连接的安全性取决于此交换的安全性,因此您需要确保以适当的安全级别保护此类交换。
我可以相信这家公司不会骗我吗?
这是一个法律问题。请注意,即使公共 CA 实际上也不会做出此断言。公共 CA 所做的只是断言密钥属于特定组织,他们不会断言他们所认证的公司的道德。您可能希望确保您签订了关于您将为彼此提供什么样的服务、是否需要支付任何款项以及如果一方单方面违反合同会发生什么的合同。
我可以相信这家公司有能力管理他们的安全,以避免不必要的损失吗?
这也是一个很难的问题。如果对方无法满足他们的安全要求并给你们其他人造成损失,您需要确保您的合同规定了会发生什么。您可能还想要求另一家公司出具由独立财务和/或安全审计师出具的审计证书。
与往常一样,这是关于您信任该服务的提供者。
在这种情况下,您不能依靠全球知名的 CA(证书颁发机构)来确保信任,这无论如何都是有问题的。
与往常一样,您应该在连接时检查证书的颁发者(CA),以及您是否通过本地存储信任该 CA。如果您信任本地存储的 CA 证书,那么这不亚于(甚至比使用 3rd 方 CA)更安全。
使用自签名证书的风险在于客户端。客户端使用 SSL 证书来了解服务器公钥,该公钥稍后用于加密。使用由受信任的 CA 签名的证书向客户端保证密钥属于预期的服务器。
当客户端接受不是由受信任的 CA 签名的证书时,客户端就有与假服务器通信的风险(中间人攻击出现)。如果客户端一次确认证书是真实的,那么浏览器会记住证书,下次访问时不会显示警告。
需要注意的是,由于自签名证书不是由 CA“管理”的,因此不可能撤销。如果攻击者窃取了您的私钥,您将永久丢失,而 CA 颁发的证书仍然具有理论上的吊销安全网(CA 声明给定证书已失效的一种方式)。
所以推荐使用可信 CA 签署的证书。如果您负担不起从 CA 获得证书的费用,那么最好按照 stephane answer 中的建议进行证书固定。