keystore.jks和truststore.jks可以';在Spring Boot应用程序中找不到

keystore.jks和truststore.jks可以';在Spring Boot应用程序中找不到,spring,spring-boot,keystore,Spring,Spring Boot,Keystore,我编写了一个双向授权restful服务cleint,以通过https使用8443端口上的安全restful web服务。以下是application.properties的部分内容: trust.store=classpath:truststore.jks trust.store.password=xyz123 key.store=classpath:keystore.jks key.store.password=xyz123 下面是配置RestTemplate的两种方法 @Configurat

我编写了一个双向授权restful服务cleint,以通过https使用8443端口上的安全restful 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 launcer时

java-jarapp.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.keystrepassword=xyz123-jar app.jar


得到了同样的例外。任何帮助都将不胜感激。

尝试使用resource.getInputStream()而不是resource.getFile(),因为在Spring中,resource.getFile()尝试访问文件系统路径,但无法访问JAR中的路径

这个链接有丰富的内容,请看一看安迪的答案

示例:

Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
            InputStream dbAsStream = resource.getInputStream();
你有完整的路径吗

-Djavax.net.ssl.trustStore=something/like/this/truststore.jks

尝试使用resource.getInputStream()代替resource.getFile(),因为在Spring中,resource.getFile()尝试访问文件系统路径,但无法访问JAR中的路径

这个链接有丰富的内容,请看一看安迪的答案

示例:

Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
            InputStream dbAsStream = resource.getInputStream();
你有完整的路径吗

-Djavax.net.ssl.trustStore=something/like/this/truststore.jks

问题可能与类路径有关。您的
truststore.jks
keystore.jks
文件是否位于运行
java-jar app.jar
的同一目录中?是的,app.jar、truststore.jks和keystore.jks位于我运行java-jar app.jar的同一目录中。问题可能与类路径有关。您的
truststore.jks
keystore.jks
文件是否位于运行
java-jar app.jar
的同一目录中?是的,app.jar、truststore.jks和keystore.jks位于运行java-jar app.jar的同一目录中。