在Spring Boot App中找不到keystore.jks和truststore.jks

时间:2019-02-06 05:41:54

标签: spring spring-boot keystore

我编写了一个双向身份验证静态服务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

,并且有同样的例外。任何帮助将不胜感激。

1 个答案:

答案 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