我编写了一个双向身份验证静态服务cleint,以通过https在端口8443上使用安全的静态Web服务。这是application.properties的一部分:
trust.store = classpath:truststore.jks
trust.store.password = xyz123
key.store = classpath:keystore.jks
key.store.password = xyz123
以下是两种配置RestTemplate的方法
@Configuration
public class SSLTemplate {
@Value("${key.store}")
private String keyStore;
@Value("${key.store.password}")
private String keyStorePassword;
@Value("${trust.store}")
private String trustStore;
@Value("${trust.store.password}")
private String trustStorePassword;
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception {
SSLContext sslContext = SSLContextBuilder.create()
.loadKeyMaterial(ResourceUtils.getFile(keyStore), keyStorePassword.toCharArray(), keyStorePassword.toCharArray())
.loadTrustMaterial(ResourceUtils.getFile(trustStoreF), trustStorePassword.toCharArray())
.build();
...
}
@Configuration
public class SSLTemplate {
@Value("${key.store}")
private Resource keyStoreR;
@Value("${key.store.password}")
private String keyStorePassword;
@Value("${trust.store}")
private Resource trustStoreR;
@Value("${trust.store.password}")
private String trustStorePassword;
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception {
SSLContext sslContext = SSLContextBuilder.create()
.loadKeyMaterial(keyStoreR.getURL(), keyStorePassword.toCharArray(), keyStorePassword.toCharArray())
.loadTrustMaterial(trustStoreR.getURL(), trustStorePassword.toCharArray())
.build();
...
}
当我通过bootRun或在Eclipse中运行该应用程序时,它们都可以工作。
但是当我使用jar发射器时
java -jar app.jar
我有例外。
通过工厂方法实例化Bean失败;嵌套的异常是org.springframework.beans.BeanInstantiation 异常:无法实例化[org.springframework.web.client.RestTemplate]:工厂方法“ restTemplate”抛出异常; 嵌套异常为java.io.FileNotFoundException:URL无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/ C:/build/libs/app.jar!/ BOOT-INF / classes! /truststore.jks
我也尝试过
java -Djavax.net.ssl.trustStore = truststore.jks -Djavax.net.ssl.trustStorePassword = xyz123 -Djavax.net.ssl.keyStore = keystore.jks -Djavax.net.ssl.keyStorePassword = xyz123 -jar app.jar
,并且有同样的例外。任何帮助将不胜感激。
答案 0 :(得分:0)
尝试使用 resource.getInputStream()代替resource.getFile(),因为Spring中的 resource.getFile()尝试访问文件系统路径,但是它可以无法访问JAR中的路径
此链接包含丰富的content,并且可以看看安迪的答案here
示例:
Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
InputStream dbAsStream = resource.getInputStream();
您是否使用完整路径
-Djavax.net.ssl.trustStore=something/like/this/truststore.jks