tomcat获得所有信任证书

时间:2015-07-11 15:28:35

标签: ssl tomcat7 truststore

我有一个小型安全应用程序,其中包含在tomcat 7中运行的服务器和客户端证书。每个客户端都有自己的证书。

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

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

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

有人可以帮忙吗?

1 个答案:

答案 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)

    检查每个别名

    LI>
  • 您现在拥有别名,这些别名是您(或某人)将每个证书导入信任库时指定的名称,但不一定与证书中客户端的实际名称相同

  • 如果您希望(<)个每个证书中的(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