2015-07-11 93 views
0

我有一个小型安全应用程序,它具有在tomcat 7中运行的服务器和客户端证书。每个客户端都有自己的证书。tomcat获取所有信任证书

在webapp中,我想要一个包含所有已知可信证书别名的选项卡,因为每个客户都必须报告所有X分钟。 如果客户端在X分钟后不报告,服务器必须标记该客户端。

所以我的想法是从Tomcat的Server.xml中定义的truststoreFile获取所有可信证书,因为我必须知道所有已注册的客户端/证书。

我的问题是,我没有找到任何api来获取所有的证书,这是tomcat会信任的。

有人可以帮忙吗?

回答

0

首先,你确定你的truststore会(总是)包含客户端证书吗? “官方”(X.509/PKIX)客户端认证(即客户端证书)方式是为客户提供CA(或多个CA)颁发证书;那么您的服务器不需要单独信任客户端证书,只需要CA(s)。这样一个CA可以是一个公共CA,一个企业,或者一个你(或你的团队/部门/任何)只为你的服务器运行。只有自签名的客户端证书才需要在服务器信任库中单独拥有它们。

其次,webapp(servlet)代码不可能获得连接器配置,可能作为安全功能,请参见Accessing SSL Private Key From a Servlet

但是,如果你有所有的证书在一个信任文件,可以找到该文件(通常是JKS),则:

  • 使用KeyStore.getInstance(String),以获得正确的密钥库对象(JKS)

  • 为该文件创建一个FileInputStream,并将其提供给ks.load(然后关闭它; try-resource可以为您执行此操作)。如果不知道密码使用null,你仍然可以访问证书(但不privatekeys,只为JKS)

  • 使用.aliases()拿到店里所有条目的列表

  • 如果有可以是这个文件中的trustedcerts和privatekey(即它不只是一个 truststore文件)检查与.isCertificateEntry(alias)

  • 每个别名,你现在有别名,这是当你(或其他人)每个导入证书到信任指定的名称,但不一定是相同的证书客户的实际名称

  • 如果你想(任意)的名称字段(S)每个证书,叫.getCertificateEntry(alias),转换为X509Certificate,并调用.getSubjectX500Principal()然后.toString()或一个.getName()重载并根据需要解析或检查结果

最后,既然你想使用每个证书通过别名跟踪请求,为每个请求获得Read out incoming certificate in Tomcat用作再看看叶证书即chain[0].getCertificateAlias(Certificate)的证书。跟踪每个别名上次请求的时间,您可以识别任何“缺失”的。

Javadoc for KeyStore is at http://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html