ssl - TLS 客户端证书:授权的哪个属性?
问题描述
我正在尝试设置一个 Web 服务,该服务使用在 TLS 握手期间发送的 x509 客户端证书进行身份验证,并检查用户是否有权访问请求的资源。
这个想法是每个用户都被赋予一个访问级别,并且一些资源只对更高级别可用。然后使用证书将用户与其级别相匹配。
我在配置 Apache 以根据根 CA 验证证书并将证书转发到后端应用程序(基于 python 的 XML-RPC 服务器)时没有问题。
但是,我正在努力选择我应该使用哪些证书属性将用户映射到他的级别:
- Common Name 字段似乎是一个自然的选择,但我想知道这个解决方案的安全性如何,因为没有什么能阻止多个中间 CA 提供具有相同 CN 的证书
- 公钥本身显然更安全,但使用起来有多实用?如果客户在证书到期后必须更新证书,它会保持不变吗?还有一个更大的字符串的存储和比较速度的问题
- 整个证书本身或其指纹指纹可以替代公钥,但如果更新他的证书,客户端将无法连接
我目前倾向于使用公钥,但在这种情况下它是最佳选择吗?还是有更好的选择?
预先感谢
解决方案
通常,使用客户端证书进行身份验证是通过一些私有 CA 来完成的,该 CA 颁发客户端证书并且仅在验证客户端证书时信任 CA。在这种情况下,受信任的 CA 并且只有这个 CA 可以完全控制证书的主题,这意味着将 CN 映射到用户是非常好的并且也是常用的。
如果您出于某种原因想要允许由任意 CA 颁发的证书,那么您已经意识到自己无法完成这种简单的映射。在这种情况下,可能会完成证书公钥或证书指纹之间的映射,这当然需要预先知道特定用户期望的确切证书。而且,每当客户端证书因为过期而需要更改时,都需要以某种方式更新此映射。
推荐阅读
- java - java - 如何在我不知道我的节点名称的java中获取类似的唯一节点名称的计数,我只是将XML作为输入
- python - 如何在python中用函数random选择一个整数?
- jasper-reports - 如何从密码中删除“-”和显示空白?
- android - 获取平台cordova-android@^8.0.0 失败
- c# - 在控制器中获取选择值
- azure-data-explorer - 如果输入是查询,连续数据导出如何确定摄取时间
- twilio - Web 浏览器不显示 iOS 设备视频轨道
- powershell - 用于在 Azure Active Directory 中创建安全组以管理对 Azure SQL 的访问的 Powershell 脚本
- coq - 当归纳删除太多信息以使目标可解决时该怎么办?
- c++ - 简单的语义动作会破坏 Spirit X3 中的结果