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
我有一个带有服务器和客户端证书的小型安全应用程序,它是 运行 在 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