我有一个小型安全应用程序,其中包含在tomcat 7中运行的服务器和客户端证书。每个客户端都有自己的证书。
在webapp中,我想要一个包含所有已知可信证书别名的选项卡,因为每个客户端都必须报告所有X分钟。 如果客户端在X分钟后没有报告,则服务器必须标记此客户端。
所以我的想法是从Tomcat的Server.xml中定义的truststoreFile获取所有可信证书,因为我必须知道所有已注册的客户端/证书。
我的问题是我找不到任何api来获取tomcat会信任的所有证书。
有人可以帮忙吗?
答案 0 :(得分:2)
首先,您确定您的信任库将(始终)包含客户端证书吗?客户端身份验证(即客户端证书)的“官方”(X.509 / PKIX)方式是让CA(或多个CA)向客户端颁发证书;那么您的服务器不需要单独信任客户端证书,只需要信任CA。这样的CA可以是公共CA,企业CA,也可以是您(或您的组/部门/其他)仅为您的服务器运行的CA.仅对于自签名客户端证书,必须在服务器信任库中单独使用它们。
其次,webapp(servlet)代码似乎无法获得连接器配置,可能作为安全功能,请参阅Accessing SSL Private Key From a Servlet。
但是,如果你确实拥有信任库文件中的所有证书 并且可以找到该文件(通常是JKS),那么:
使用KeyStore.getInstance(String)
获取正确类型的密钥库对象(JKS)
为文件创建FileInputStream
,并将其提供给ks.load
(然后关闭它; try-resource可以为您执行此操作)。如果您不知道密码使用null
,您仍然可以访问证书(但不能访问私有密钥,仅适用于JKS)
使用.aliases()
获取商店中所有条目的列表
如果此文件中可以同时包含trustedcerts和privatekeys(即它不是只是信任库文件),请使用.isCertificateEntry(alias)
您现在拥有别名,这些别名是您(或某人)将每个证书导入信任库时指定的名称,但不一定与证书中客户端的实际名称相同
如果您希望(<)个每个证书中的(em)名称字段,请致电.getCertificateEntry(alias)
,投放到X509Certificate
,然后致电{{1然后.getSubjectX500Principal()
或其中一个.toString()
重载并根据需要解析或检查结果
最后,由于您希望通过别名跟踪使用每个证书的请求,因此对于每个请求,请获取Read out incoming certificate in Tomcat中使用的证书,然后查找叶子证书即.getName()
与chain[0]
。跟踪每个别名上次请求的时间,您可以识别任何“丢失”的别名。
KeyStore的Javadoc位于http://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html