Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何在application.yaml中为ssl客户端指定密钥库和信任存储?_Spring Boot_Ssl_Yaml - Fatal编程技术网

Spring boot 如何在application.yaml中为ssl客户端指定密钥库和信任存储?

Spring boot 如何在application.yaml中为ssl客户端指定密钥库和信任存储?,spring-boot,ssl,yaml,Spring Boot,Ssl,Yaml,我有一个spring引导应用程序,它调用一个支持ssl的rest服务,该服务需要相互ssl身份验证。我需要指定一个密钥存储和信任存储来在此客户端应用程序中进行调用 当我在Java代码中指定keystore和truststore信息(key和trust store jks文件的路径、类型和密码)时,如下所示,调用就起作用了 public static void main(String[] args) throws Exception { System.setProperty("javax.

我有一个spring引导应用程序,它调用一个支持ssl的rest服务,该服务需要相互ssl身份验证。我需要指定一个密钥存储和信任存储来在此客户端应用程序中进行调用

当我在Java代码中指定keystore和truststore信息(key和trust store jks文件的路径、类型和密码)时,如下所示,调用就起作用了

public static void main(String[] args) throws Exception {
    System.setProperty("javax.net.ssl.trustStore", "/path/to/tmnt-truststore");
    System.setProperty("javax.net.ssl.keyStore", "/path/to/donatello.p12");
    System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
    System.setProperty("javax.net.ssl.keyStorePassword", "donatellopass");
但是我如何在application.yaml中指定它呢

我尝试使用以下模式specifynt keystore、truststore、key和trust store类型和密码,完全是我使用System.setProperty指定的所有信息

javax:
    net:
        ssl:
            trust-store: /path/to/tmnt-truststore
但是不起作用。 我收到错误的消息

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
尝试为密钥库和信任存储指定两种模式
信任存储
信任存储

此客户端应用程序还公开了一个rest端点,并且该信息在与之相同的yaml文件中指定

server:
    context-path: /my-context
    port: 8200
spring:
    application:
        name: mhapp
应用程序似乎正在收集这些信息。但不是javax.net.ssl.keyStore等


如何在
application.yaml中指定,以及是否需要执行其他操作(如添加任何注释)来加载该信息?

请先在application.property文件中尝试下面的操作,如果工作正常,可以将其放入yaml文件中

server.ssl.key-alias=selfsigned
server.ssl.key-password=test123
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
如果没有,您可以将所有值放在一个属性文件中,并创建如下配置文件,这将使rest模板调用外部服务

@Configuration
public class SslConfiguration {
    @Value("${http.client.ssl.trust-store}")
    private Resource keyStore;
    @Value("${http.client.ssl.trust-store-password}")
    private String keyStorePassword;

    @Bean
    RestTemplate restTemplate() throws Exception {
        SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(
                        keyStore.getURL(),
                        keyStorePassword.toCharArray()
                ).build();
        SSLConnectionSocketFactory socketFactory = 
                new SSLConnectionSocketFactory(sslContext);
        HttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory).build();
        HttpComponentsClientHttpRequestFactory factory = 
                new HttpComponentsClientHttpRequestFactory(httpClient);
        return new RestTemplate(factory);
    }
}