【问题标题】:tomcat get all trust certificatestomcat 获取所有信任证书
【发布时间】:2015-09-30 06:19:16
【问题描述】:

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

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

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

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

有人可以帮忙吗?

【问题讨论】:

    标签: ssl tomcat7 truststore


    【解决方案1】:

    首先,您确定您的信任库将(始终)包含客户端证书吗?客户端身份验证(即客户端证书)的“官方”(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)检查每个别名

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多