spring - 春季无法使用 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 文件创建truststore
并keystore
添加到类路径中,但我仍然收到:
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);
有人可以告诉我我错过了什么或我做错了什么吗?
解决方案
推荐阅读
- css - 悬停在表格上时如何突出显示表格的行和列?
- javascript - keydown 函数分配给两个键,但在按下任意键时触发
- java - 错误消息“找到可能不是 UTF-8 编码的字符”是什么意思?
- gradle - Java Home 不断恢复到 JRE,但我需要 JDK
- assembly - 需要用汇编计算二进制中 1 的数量
- amazon-ec2 - 将 AWS EBS 挂载到 CoreOS
- javascript - 如果选择了“所有年份”选项,则共享相同的 php 函数
- vue.js - 在VUE中将动态对象值传递给Modal Popup打开错误的ID值
- sql - SELECT 在任何地方返回多于一行的 sql
- javascript - 将点击功能更改为仅播放