我们从客户端(例如:https://localhost:8080/)传递与证书相关的值,并调用其余服务(托管在不同的端口-https://localhost:446/serviceName上)。
问题就像,当我们尝试通过证书时,SSL握手正确发生(调试时没有错误),但是证书值未传递给另一个端口上托管的服务。通过参考(X509Certificate)httpReq.getAttribute(“ javax.servlet.request.X509Certificate”)在服务器代码中访问证书值;
注意:我们使用的Spring Boot应用程序通常运行在tomcat服务器上,并且所需的CA授权证书,密钥库和信任库都存在于两个项目(托管的客户端和服务)的资源路径中。在rest service项目配置文件中,client-auth设置为false。
用于调用休息服务的示例代码段:
SSLContext sslContext = SSLContexts.custom()。loadTrustMaterial(restserviceTruststore) .loadKeyMaterial(restserviceKeyStore,password).build();
HttpClient client = HttpClients.custom() .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
.setSslcontext(sslContext).build();
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(client));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
HttpEntity<String> request = new HttpEntity<>(XML, headers);
response = restTemplate.postForObject(endpointURL, request, String.class);
问题:
1)我们需要从客户端将什么密钥库和信任区传递给SSLContext?是服务器的密钥库/ truststore还是客户端?
2)要解决此问题应遵循哪些确切步骤。