我写了一个2路authetication RESTful服务cleint通过HTTPS消耗在8443端口一个安全的RESTful Web服务。这里有application.properties的部分:
trust.store =类路径:truststore.jks
trust.store.password = XYZ123
key.store =类路径: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的罐子app.jar
我有例外下面。
通过工厂方法实例化Bean的失败;嵌套的异常是org.springframework.beans.BeanInstantiation例外:无法实例[org.springframework.web.client.RestTemplate]:出厂方法“restTemplate”抛出异常;嵌套的例外是java.io.FileNotFoundException:URL不能被解析为绝对文件路径,因为它不存在于文件系统中:jar:文件:/ 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
并得到了相同的异常。任何帮助将非常感激。
尝试使用resource.getInputStream()而不是resource.getFile()的,resource.getFile()在Spring试图访问一个文件系统路径,但它不能在你的JAR访问路径
示例例如:
Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
InputStream dbAsStream = resource.getInputStream();
和你有使用全路径
-Djavax.net.ssl.trustStore=something/like/this/truststore.jks