在Spring Boot Tomcat Server中配置额外的信任库



我有一个spring-boot客户端应用程序和一个服务器应用程序。我正在实现MTLS客户端身份验证部分。我有一个自签名的客户端证书,需要将其添加到服务器中的自定义信任存储中。基本上,我正在寻找一种在运行时添加自定义信任库的机制。

我希望默认的信任库和自定义的信任库被提取。我使用TomcatServlet WebServerFactory实现了这一点,但我运气不佳。有人能帮忙吗。我正在寻找一个程序化的解决方案。

我不想更改默认的java信任库。我仍然需要它。

由于您不想用自定义信任库替换现有的信任库(可以通过运行带有一些系统属性的JVM来完成(,因此如果内置或自定义信任库批准客户端,则需要添加信任对等方的代码。

为此,您需要创建并安装自己的Trustmanager。请参阅此处的示例:https://community.oracle.com/tech/developers/discussion/1535342/java-ssl-trustmanager

如果checkClientTrustedcheckServerTrusted方法没有引发异常,则会批准证书。将方法留空甚至会关闭任何证书验证,这是不建议的。

为了在Spring客户端应用程序和Spring服务器应用程序之间建立具有客户端证书的SSL连接,需要注意以下几点:

涉及的信托商店

在这种情况下,有两种非常不同的信任存储:

  1. 客户端用于确定是否可以信任服务器的SSL证书的信任存储。当将java.net包用于客户端请求时,信任存储是通过JVM属性"配置的;javax.net.ssl.trustStore"-参见例如。https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html

  2. Tomcat(Spring Boot在其默认配置中使用的底层servlet容器(用于确定是否信任客户端的信任存储。这是通过弹簧应用特性";server.ssl.信任存储"-看见https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.server.server.ssl.trust-store

在Spring服务器应用程序的上下文中,第一个与服务器与第二个服务器的连接相关,因此只有当服务器也充当客户端时,例如当充当代理服务器时。

第二个信任存储与服务器及其客户端之间的连接相关。这是你需要处理的问题。

Tomcat信任存储中的证书

Tomcat使用的信任存储不包含客户端证书。相反,它必须包含已签署客户端证书的证书颁发机构的证书。因此,当使用自签名证书时,您需要安装自己生成的CA证书。

这样做的最大优点是,当您授予对新客户端的访问权时,不需要更改服务器信任存储。

缺点是,您必须处理证书吊销。CRL(证书吊销列表(也存储在信任存储中。参见:

CRL解释:什么是证书吊销列表?

合并默认信任存储和自定义信任存储

现在应该清楚的是,这不是一个好主意,而且会构成一个主要的安全漏洞,因为它会允许任何在默认信任存储中拥有CA签名证书(可以很容易地获得(的客户端连接到服务器。服务器信任存储必须仅包含用于对客户端证书进行签名的证书!

没有必要将两者合并,因为这是完全独立的信任存储,具有完全不同的功能。

但是,当然,合并信托商店在技术上是可行的。这一切都可以通过keytool完成-请参阅下文。

管理信任存储

添加、删除、导出、列出和打印证书和CRL都可以通过Oracle命令行工具";"keytool";,它是OpenJDK的一部分。参见

关键工具参考

最新更新