以编程方式设置信任库

时间:2019-01-25 10:45:11

标签: java spring spring-boot tomcat truststore

我想为我的应用程序设置自定义信任库。我想使用System.setProperty()。在tomcat中设置不是一种选择。

所有配置似乎都不错,但是不起作用。 我使用带有外部tomcat的Spring Boot 2.0.6。

我尝试过在SpringApplication.run之前的其他地方进行配置,例如在Bean的Postconstruct中。这是我最近的代码:

 static {
    System.setProperty("javax.net.debug", "all");
    System.setProperty("javax.net.ssl.trustStore", "/opt/grtc8/profiles/appconf/insurance/https-trust.p12"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "xys");
    System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
 }

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(InsuranceCalculatorApplication.class);
}

public static void main(String[] args){

    SpringApplication.run(InsuranceCalculatorApplication.class, args);
}

似乎有一个例外,它不读取文件或其他内容。

我正在使用Tomcat 8.5。

1 个答案:

答案 0 :(得分:2)

在Java代码中设置系统属性是一种相当可疑的做法。问题在于,只有在确保设置属性的代码总是(总是)在使用属性的代码之前运行。

在这种情况下,初始化SSL提供程序时将使用属性。这很可能是由于在静态块执行之前 发生的一些静态初始化触发的。

有两种解决方法:

  1. 使用-D选项从命令行设置属性。根据您的要求,您也许可以做一些“启动时”的魔术来选择信任库。例如使用包装脚本或自定义启动器应用程序。

  2. 使用Java代码为JVM加载默认的信任库等,而不是依赖于属性。例如:Load java trust store at runtime - after jvm have been launched?

    让这种方法与Tomcat配合使用可能会很棘手……假设您要在Tomcat的服务器端执行此操作。

  3. 显然,如果使用SpringBoot,则可以替换默认的Tomcat连接器。参见Spring Boot - replace default embedded Tomcat connector。这可能会给您带来“便利”。

但是我认为务实的解决方案是第一个。更改规则:-)