我想为我的应用程序设置自定义信任库。我想使用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。
答案 0 :(得分:2)
在Java代码中设置系统属性是一种相当可疑的做法。问题在于,只有在确保设置属性的代码总是(总是)在使用属性的代码之前运行。
在这种情况下,初始化SSL提供程序时将使用属性。这很可能是由于在静态块执行之前 发生的一些静态初始化触发的。
有两种解决方法:
使用-D
选项从命令行设置属性。根据您的要求,您也许可以做一些“启动时”的魔术来选择信任库。例如使用包装脚本或自定义启动器应用程序。
使用Java代码为JVM加载默认的信任库等,而不是依赖于属性。例如:Load java trust store at runtime - after jvm have been launched?。
让这种方法与Tomcat配合使用可能会很棘手……假设您要在Tomcat的服务器端执行此操作。
显然,如果使用SpringBoot,则可以替换默认的Tomcat连接器。参见Spring Boot - replace default embedded Tomcat connector。这可能会给您带来“便利”。
但是我认为务实的解决方案是第一个。更改规则:-)