如何在春季启动时发送带有请求的.p7b格式客户端证书



我对SSL/TLS相当陌生。我正在编写一个java客户端,它将对URL进行简单的get请求。但除了URL,我还必须发送提供给我的客户端证书(.p7b(。我已经提取了.p7b文件中的所有证书,以分离.cert文件,并将这些.cert文件添加到java信任存储中。然而,在完成了所有步骤之后,当我到达终点时,我会收到这个警告

*** ServerHelloDone
[read] MD5 and SHA1 hashes:  len = 4
0000: 0E 00 00 00                                        ....
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
***

这是我用来配置rest模板的java代码

@Bean
public RestTemplate getTemplate(RestTemplateBuilder builder) throws Exception{
char[] password = "changeit".toCharArray();
SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(keyStore("classpath:truststore/truststore.jks", password), new TrustSelfSignedStrategy())
.build();
HttpClient client = HttpClients.custom().setSSLContext(sslContext).build();
return builder
.requestFactory(new HttpComponentsClientHttpRequestFactory(client))
.build();   

}

private KeyStore keyStore(String file, char[] password) throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
File key = ResourceUtils.getFile(file);
try (InputStream in = new FileInputStream(key)) {
keyStore.load(in, password);
}catch(Exception e) {
e.printStackTrace();
}
return keyStore;
}

我想不出我错过了什么。请帮助

如果您所说的"发送[a]客户端证书"实际上是指执行SSL/TLS客户端身份验证,即使您省略了日志中直接显示该证书的部分,但您尝试连接的服务器也明确请求了该身份验证,这不仅仅包括发送证书。发送证书并不能证明身份,因为任何人都可以复制并发送证书。要进行身份验证和验证身份,系统中的SSL/TLS实现(这里是Java的JSSE组件(必须同时发送证书和链证书(如果需要(,并使用相应的私钥对握手中的某些数据进行签名。有些人只注意到,因此只谈论第一部分,但没有第二部分就没有用。

简而言之,仅仅发送证书是没有用的,这意味着仅仅拥有证书是没有用处的。你必须同时拥有证书(通常是链(和私钥,但显然没有,因为p7b不能包含私钥。

通常和推荐的过程是,你从CA(或从CA获得证书的人那里(获得证书,可能但不一定是p7b,因为你首先生成并给了他们CSR(证书签名请求(,在这种情况下,你已经有了私钥,找到它并使用它。使用它的方法取决于它的形式,这反过来取决于你是如何生成的,你没有说,但你最终会想要一个KeyStore对象,你可以给.loadKeyMaterialNOTTrust。(如果服务器正在使用不是已建立的"公共"CA之一的CA(或锚点(下的证书,则只需要或应该使用.loadTrustMaterial。(

如果其他人生成了CSR并(然后(获得了证书,他们需要给你私钥,或者你需要从他们那里获得私钥,然后如上所述将其与证书一起使用。

最新更新