为移动应用程序引入客户端证书会提高安全性吗?

信息安全 tls 证书 移动的
2021-08-14 03:27:58

我开发了一个 REST API,它被配置为仅通过 HTTPS 运行。此 API 的唯一目的(至少目前)是作为移动应用程序的后端入口点运行。

我推出了用于客户端身份验证的自己的令牌身份验证协议(请参阅此问题/答案)。这背后的主要原因是能够生成安全/可重复使用的令牌,客户端可以在本地存储这些令牌并在后续请求中重复使用。由于我可以控制这些令牌服务器端,因此我可以强制客户端重新进行身份验证(即生成新令牌)过期/无效,并且我还采取了预防措施来避免类似中间人/重播攻击。为此,必须有一些敏感信息以纯文本形式通过网络传递,但是,一切都通过 SSL 运行,因此 AFAIK 没有什么可担心的(?)。

不过,目前的设置有几个部分确实让我担心:

  1. 对于服务器身份验证,当应用程序收到服务器证书(自签名)时,我只检查证书主题(例如 CN=域名)是否与 API 地址相同,即 API 入口点是否为 api.mydomain.com它必须接收主题为 CN=api.mydomain.com 的证书,否则 SSL 会话将失败。

  2. 从服务器的角度来看,匿名请求没有保护。客户端身份验证仅发生在检查标头/帖子信息的地方。我相信这可能会为 Dos 攻击敞开大门。理想情况下,我希望服务器只接受来自已知来源的请求。

我对第一个问题的担忧是它太容易规避了,api 地址可以从应用程序设置中配置,任何人都可以生成自签名证书,因此欺骗应用程序认为它正在与正确的服务器通信是相当简单的. 第二个问题只是一个普遍关注的问题,但是,如果我可以过滤掉任何未经身份验证的客户端请求,那将是一个奖励!

唯一想到要解决的问题(至少是第二个问题)是引入客户端证书。我关心的是实施时间、部署的复杂性和证书本身的管理。我想我正在寻找一些关于(基于当前设置)向设备引入客户端证书是否会在这里获得任何东西的建议?

1个回答

身份验证是为了确保连接另一端的任何人都是您认为的人。由于这是密码学、计算机和网络,“你是谁”等同于“你能计算什么”(这是你可以从远程服务器上观察到的一切),它本身来自“你所知道的”(每个人都可以购买一台 PC,所以计算任何东西的能力实际上是计算输入的知识)。例如,对于基于密码的身份验证,相对于他对密码的了解对用户进行身份验证。

此类知识与初始注册相关联,在该初始注册中,无论秘密值是什么,都将获得其特殊含义。仍以密码为例,这是用户选择密码的过程,服务器将密码(或其哈希)记录在其内脏中。

证书在注册身份验证由不同实体完成的情况下很有用:注册由颁发(签署)客户端证书的证书颁发机构完成,而验证由服务器本身完成,验证证书(验证签名)来自 CA),然后验证客户端计算的新签名(这就是在 SSL 中使用客户端证书的方式)。

如果您只有一台服务器,由谁来决定谁可以连接,然后对这些客户端进行身份验证,那么客户端证书对您来说毫无用处:它们不会为更简单的显示密码协议带来任何额外的功能或安全性(只要“密码”是具有足够熵的密钥,并且协议在 SSL 内播放)。