Java 是否可以在没有信任库的情况下在客户端实现MTL?
我一直在实现一个restTemplate,它向一个受MTL保护的服务器发送帖子。我在Springboot中实现了以下bean。简单地说,我为restTemplate提供了一个密钥库和一个信任库(.jks格式)来实现双向ssl连接,但我不需要使用信任库,而是需要检查服务器证书的某些字段来验证它Java 是否可以在没有信任库的情况下在客户端实现MTL?,java,security,ssl,ssl-certificate,resttemplate,Java,Security,Ssl,Ssl Certificate,Resttemplate,我一直在实现一个restTemplate,它向一个受MTL保护的服务器发送帖子。我在Springboot中实现了以下bean。简单地说,我为restTemplate提供了一个密钥库和一个信任库(.jks格式)来实现双向ssl连接,但我不需要使用信任库,而是需要检查服务器证书的某些字段来验证它 @Bean @Autowired public RestTemplate mtlsRestTemplate(KeyStore keystore) throws IOException, Unrecovera
@Bean
@Autowired
public RestTemplate mtlsRestTemplate(KeyStore keystore) throws IOException, UnrecoverableKeyException, KeyManagementException {
if (!isMtlsActivated) {
return classicRestTemplate();
}
SSLContext context;
try {
context = SSLContextBuilder.create()
.setProtocol("TLS")
.loadKeyMaterial(keystore, keyStorePassword.toCharArray())
.loadTrustMaterial(new File(trustStoreLocation), trustStorePassword.toCharArray())
.build();
} catch (CertificateException | NoSuchAlgorithmException | KeyStoreException e) {
// [...]
}
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClients.custom().setSSLSocketFactory(
new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE))
.setMaxConnTotal(maxConnectionsTotal)
.setMaxConnPerRoute(maxConnectionsPerRoute)
.build());
clientHttpRequestFactory.setConnectTimeout(5000);
clientHttpRequestFactory.setReadTimeout(5000);
return new RestTemplate(clientHttpRequestFactory);
}
我的需要来自服务器策略,当涉及到更新他们的证书时。此任务将经常执行,这将迫使我不断手动检查和上载新证书(因为此操作无法自动化)。我一直在读,在使用Spring安全性的服务器端,您可以发送自己的证书,然后检查客户端证书的cn(例如在其他地方)。当使用my bean生成的RestTemplate的.exchange()
方法时,是否有任何方法可以检查cn(或dn,或任何其他字段,不确定最安全的字段)
Edit1:我一直在尝试,我已经能够创建一个实现CertificateTrustStrategy
的类,并以信任库初始化的相同方式将其加载为信任材料,但我不知道除了DN之外如何检查证书的有效性。我忘了解释我不能使用CA证书(客户端证书)进行检查,但是,我可以使用不会更改的字段进行检查,如果CA更改其证书