使用客户端 SSL 证书作为 Web 应用程序身份验证

信息安全 tls
2021-09-10 05:48:34

我正在开发一个需要身份验证的简单 API 的 Web 应用程序。对于我的应用程序性质,用户有两个 RSA 密钥,用于签名和加密消息。我的协议基于它工作。Web 应用程序可以访问公钥。

实现身份验证和杀死 MITM 的一种解决方案是在应用程序 API 上构建 SSL,并使用用户密钥构建身份验证方法。简单的消息传递。但我正在考虑另一种方法......基于 SSL 客户端认证进行身份验证。我曾在以前的项目中使用过客户端证书,但在决定是否将其用于此项目时遇到了一些问题:

  1. 使用用户 RSA 密钥之一为其生成证书是个坏主意吗?

  2. 是否有任何网络服务器(作为 SSL 包装器)可以让我在与外部程序进行 SSL 协商期间扩展功能?我的意思是当用户发送 SSL 请求时,我在数据库中查找他的证书 (a),如果找到,则将一条记录作为会话 ID 插入到数据库中,并且 Web 应用程序使用它 (b)。这意味着不仅要授予某些用户访问权限,还要找出哪个用户已登录。回答:至少 nginx 支持将收到的客户端证书传递给 Web 应用程序。我就这样过去了。

  3. 性能分析。我怀疑大量用户和这种基于证书的身份验证性能,但身份验证是我的应用程序中应该完成的一部分,SSL 也是。与仅使用服务器证书相比,使用客户端服务器证书时,我可以预期哪些额外的负载和延迟?答案:见 MadHatter 的答案

感谢您的建议,并为我的英语不好感到抱歉。

1个回答
  1. 进行客户端证书验证的常规方法是创建您自己的证书颁发机构 (CA),并使用该 CA 来生成分发给客户端的客户端证书。然后,服务器只需检查客户端证书是否具有来自预配置 CA 的有效签名,或者具有返回该 CA 的有效信任链,即可知道客户端证书是好的。

  2. 往上看。

  3. 很少有额外的开销,至少在如上所述完成时。无论如何,所有客户端都有证书(公钥),它们只是(通常)自签名并且仅用于加密而不是加密身份验证;如果客户端使用带有有效签名的证书,则让服务器验证该证书是非常小的额外开销。