keystore.jks и truststore.jks не могут быть найдены в приложении Spring Boot - PullRequest
0 голосов
/ 06 февраля 2019

Я написал двухстороннюю служебную очистку с проверкой подлинности для использования защищенной успокоительной веб-службы через порт 8443 через https.Вот части 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 launchcer

java -jar app.jar

Я получил исключение ниже.

Не удалось создать экземпляр объекта с помощью фабричного метода;вложенным исключением является org.springframework.beans.BeanInstantiation Exception: не удалось создать экземпляр [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 голосов
/ 06 февраля 2019

Попробуйте использовать resource.getInputStream () вместо resource.getFile () as, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...