keystore.jks和truststore.jks不能在春季启动应用程序中找到

问题描述 投票:1回答:1

我写了一个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

并得到了相同的异常。任何帮助将非常感激。

spring spring-boot keystore
1个回答
0
投票

尝试使用resource.getInputStream()而不是resource.getFile()的,resource.getFile()在Spring试图访问一个文件系统路径,但它不能在你的JAR访问路径

该链接具有丰富content,做看看安迪的回答here

示例例如:

Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
            InputStream dbAsStream = resource.getInputStream();

和你有使用全路径

-Djavax.net.ssl.trustStore=something/like/this/truststore.jks
© www.soinside.com 2019 - 2024. All rights reserved.