2

我编写了一个 2-way authetication RESTful 服务客户端来通过 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 发射器时

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

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

4

1 回答 1

0

尝试使用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
于 2019-02-06T10:33:45.490 回答