tomcat 获取所有信任证书

tomcat get all trust certificates

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

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

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

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

有人可以帮忙吗?

首先,您确定您的信任库将(始终)包含客户端证书吗? "official" (X.509/PKIX) 客户端身份验证方式(即客户端证书)是让一个 CA(或多个 CA)向客户端颁发证书;那么您的服务器不需要单独信任客户端证书,只需信任 CA。这样的 CA 可以是 public CA、企业 CA 或您(或您的 group/division/whatever)仅为您的服务器运行的 CA。仅对于自签名客户端证书,才需要将它们单独存放在服务器信任库中。

其次,webapp (servlet) 代码似乎不可能获取连接器配置,这可能是一项安全功能,请参阅 Accessing SSL Private Key From a Servlet

但是,如果您确实拥有信任库文件中的所有证书并且可以找到该文件(通常是 JKS),那么:

  • 使用KeyStore.getInstance(String)获取正确类型的密钥库对象(JKS)

  • 为文件创建一个 FileInputStream,并将其提供给 ks.load(然后关闭它;try-resource 可以为您完成此操作)。如果您不知道密码,请使用 null 并且您仍然可以访问证书(但不是私钥,并且仅适用于 JKS)

  • 使用.aliases()获取商店中所有条目的列表

  • 如果此文件中可以同时存在受信任的证书和私钥(即它不是只是一个信任库文件)检查每个别名 .isCertificateEntry(alias)

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

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

最后,因为你想跟踪请求使用每个证书by别名,对于每个请求获取使用的证书Read out incoming certificate in Tomcat 然后查找叶证书,即 chain[0].getCertificateAlias(Certificate)。跟踪每个别名上次请求的时间,您可以识别任何 "missing" 个。

KeyStore 的 Javadoc 在 http://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html