首页 > 解决方案 > 春季无法使用 RestTemplate 调用 HTTPS 服务

问题描述

我正在尝试访问托管在另一个域中的安全 Web 服务,并且我正在代理后面访问它,我设法从带有.pem扩展名的浏览器下载证书,然后我使用以下命令将其转换为.crt并将其导入我的:keystore

keytool -import -alias nhs-dos-crt -keystore  "C:\Program Files\Java\jdk-15.0.1\lib\security\cacerts" -file NHS-DOS-CRT.cer

然后我从 pem 文件创建truststorekeystore添加到类路径中,但我仍然收到:

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

这是我尝试过的:

@Bean
    RestTemplate restTemplate() throws Exception {
        HttpHost proxy = new HttpHost(proxyServerHost, proxyServerPort);
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(basicAuthDosUsername, basicAuthDosPassword));

        SSLContext sslContext = SSLContextBuilder.create()
                .loadKeyMaterial(ResourceUtils.getFile("classpath:truststore/keystore.jks"), "changeit".toCharArray(),
                        "changeit".toCharArray())
                .loadTrustMaterial(ResourceUtils.getFile("classpath:truststore/truststore.jks"),
                        "changeit".toCharArray())
                .build();

        // SSLConnectionSocketFactory socketFactory = new
        // SSLConnectionSocketFactory(sslContext);
        HttpClient httpClient = HttpClients.custom()
                // .setSSLSocketFactory(socketFactory)
                .setSSLContext(sslContext).setProxy(isNeedProxy ? proxy : null)
                .setDefaultCredentialsProvider(credentialsProvider).build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
        return new RestTemplate(factory);
    }

然后

@Autowired
    private RestTemplate restTemplate;

    ResponseEntity<String> result = restTemplate.getForEntity(callUrl, String.class);

有人可以告诉我我错过了什么或我做错了什么吗?

标签: springspring-bootsslresttemplate

解决方案


推荐阅读