我们有一个专有框架,现在我们想通过客户端 ssl 证书集成身份验证。将客户端证书映射到专有用户帐户(例如数据库中的简单用户表)的最佳实践是什么?
- 保存到证书的公钥?
- 保存发行者和序列号?
或者还有其他可能吗?
我们有一个专有框架,现在我们想通过客户端 ssl 证书集成身份验证。将客户端证书映射到专有用户帐户(例如数据库中的简单用户表)的最佳实践是什么?
或者还有其他可能吗?
您是否颁发证书(并且有可能设置证书的某些字段)?这些证书是否必须与电子邮件签名等更大规模的 PKI 环境集成(我的意思是您有 X.509 互操作性噩梦)?
如果您可以为用户创建一个证书颁发机构,并且不必关心外部系统,您可以为每个客户端证书提供一个通用名称属性,该属性直接映射到您的用户帐户。因此您可以检查客户端证书是否由用户证书颁发机构签名,然后匹配证书CN属性。
当签名证书的数量有限且众所周知时,我建议存储此证书并检查客户端证书,并且仅当它们由其中一个签名证书签名时才接受它们。然后,您使用颁发 CA 为每个用户唯一设置的证书字段(在用户证书更新时保持相同,许多合作让用户证书在大约一年后超时)将该字段与您的用户数据库连接。
如果您不能颁发证书,您可以将证书的哈希值存储在数据库中,但这有一个缺点,即当证书过期时您需要更新数据库。每个证书的哈希值都是唯一的,而证书的大部分字段都可以被欺骗。
您可能还想检查签名证书颁发机构的证书吊销列表,因此没有用户可以使用被盗证书访问您的服务。
我们存储客户端证书的序列号和颁发者 DN 并进行匹配。根据http://www.tectia.com/manuals/server-admin/60/userauth-cert.html,这足以唯一标识证书。