CLIENT-CERT auth-method可以与tomcat中的JDBC领域一起使用吗?
JDBC领域指定用于身份验证的表结构,该表结构包含由属性userNameCol和userCredCol定义的列。这些对应于对于FORM或者BASIC身份验证方法有意义的用户和密码。它们是交互式的,需要客户端用户提供这两部分。
- 证书又带来了什么?
- 存储在userNameCol和userCredCol中的数据的示例将是什么样的?
- 在这种情况下,该领域是否有其他表结构?
PS我正在使用tomcat5.5.x。
解决方案
JDBCRealm支持CLIENT-CERT
是的,它可以。但是,很少有需要注意的怪癖。
用户名
用户名列应包含证书主题的专有名称,以字符串形式。不幸的是,Tomcat用于获取此字符串的方法会产生与实现相关的结果,因此,如果我们要切换到新的安全提供程序,甚至只是升级Java运行时,则可能需要将用户名映射为新形式。我们必须测试部署以找出使用哪种格式。
具体来说,在由X509Certificate.getSubjectDN()返回的Principal上调用getName()以获得一个String用作用户名。阅读文档后,我们会发现这不再是最好的方法。
验证
最简单的设置是将信任锚加载到Tomcat的信任存储中,该存储在" server.xml"文件中配置。使用此设置,位于我们信任的CA之一中的任何客户端证书链都将被视为"已认证",正确的身份认证意味着一个身份是已知的,并且与授权不同,后者决定了允许该身份执行的操作。
授权
由于将对拥有签名证书的任何人进行身份验证,因此我们需要设置角色以保护应用程序中的私有资源。这是通过在" web.xml"文件中设置与角色关联的安全性约束来完成的。然后,在数据库中填充"角色"表,以向受信任的用户授予额外的角色。
用户表和角色表之间的关系与基于FORM的授权完全一样,并且应被用来向我们信任的用户授予适当的权限。
密码注意事项
JDBCRealm
将创建一个新的Principal,它确实带有密码,但是除非应用程序将此Principal
向下转换为特定于Tomcat的实现(GenericPrincipal),否则该属性对我们不可见,并且不会我们在该列中输入的内容确实很重要。我建议使用NULL。
换句话说,当结合使用带客户端认证的JDBCRealm时,密码字段将被忽略。这个GenericPrincipal
有一个访问底层主体的方法,但是不幸的是,证书中的Principal
并没有传递。 JDBCRealm将其设置为null;在这种情况下,唯一有用的方法可能是getName()
(返回主题DN可能是一些非标准格式)。
表的结构和内容
使用与基于FORM的JDBCRealm(或者DatasourceRealm)完全相同的表结构。唯一的区别在于内容。用户名将是主题专有名称的文本表示,密码将是NULL或者一些虚拟值。