使用证书来保护

信息安全 tls Web应用程序 ipsec
2021-08-18 06:48:30

我正在开发一个由 C# WebAPI(在 Azure 网站上)和本机移动应用程序组成的应用程序。本质上,客户端使用 Web 界面创建一系列消息,并且可以在移动应用程序上浏览这些消息。目前,对这些数据没有限制。

一项新功能要求某些客户可以保护他们的数据,因此只允许授权人员访问。我们不想使用用户名/密码,因为开销太大。我们的客户可能有成百上千的人想要浏览他们的消息。

我的方法是:

  1. 用户使用我们的门户网站创建服务。
  2. 用户将公钥上传到我们存储的此服务中。
  3. 用户使用 MDM 将相应的私钥分发给希望浏览消息的所有设备。
  4. 对这些消息的 HTTP 请求需要提供证书。
  5. API 使用公钥验证请求。

有两件事困扰着我。

我们不会使用 CA 来验证证书链。客户的证书可以是自签名的。我不认为这是一个大问题,因为我们知道我们的客户是谁。

将私钥分布在许多设备上可能被认为是一件坏事,尽管我相信这种情况很常见,例如对 MS Exchange 进行身份验证。保护私钥的责任将由客户承担。

所以,我的问题是:这种方法看起来合理吗?

此外,Azure 网站仅支持客户端证书的开/关配置,因此无法混合公共和私人调用。是否有两个端点正在考虑良好的做法,例如

它需要应用程序中的智能来知道去哪里,但这会使应用程序的配置更加容易,因为它们要么拥有客户端证书,要么没有。

我的额外问题:使用两个端点是一种常见的做法吗?

2个回答

私钥应该只存在于一个地方。如果将私钥分发给“授权用户”,则“授权用户”拥有原始的所有访问权限,并且无法撤销。

正确的方法是:

  • 所有设备都共享他们的公钥,而不是他们的私钥。
  • 公钥由帐户持有人批准。
  • 记录的任何更改都应包括所使用的公钥,包括上述批准过程。
  • 如果您希望数据在节点之间共享,但不让服务器/黑客访问它,生成一个随机密钥,用随机密钥加密该数据段,并存储它;然后,依次用每个公钥加密随机密钥,并存储它们。然后扔掉随机密钥。每个授权用户都可以获取加密的随机密钥,用他们的私钥对其进行解密以获得随机密钥,并使用它来解密数据。

我将此作为单独的答案,以引起人们的注意。

上面的问题是一个很常见的问题——“我想要安全,但不想要安全的努力。所以我要在我的安全上偷工减料”

您的系统将不安全。

管理客户密钥的开销与管理密码的开销大致相同。人们会丢失他们的密钥,就像他们会丢失密码一样。人们的密钥会被泄露,这要容易得多,因为他们没有在上面输入密码。如果设备被盗,单击书签即可进入。

存储他们的证书并从数据库验证证书而不是遵循 CA 链的做法很好 - 您实际上是在验证公钥。这就是你需要做的。将相同的密钥分配给多个设备是一个坏主意。