SSLConnectionSocketFactory 始终 returns 400(2 路 ssl 客户端证书)未收到证书
SSLConnectionSocketFactory always returns 400(2 way ssl client cert) Certificates were not received
我有一个 ssl 连接(2 次握手),我无法理解为什么以下代码程序 400(openJdk 11,服务器提供的 p12 文件和密码,服务器提供的 cer 文件),
我已经通过以下命令从 cer 文件创建了 jks 文件:
keytool -importcert -file example-api.cer -keystore example-api.jks
代码
File keyFile = new File(Objects.requireNonNull(exampleController.class.getClassLoader().
getResource("example-client-api1.p12")).getFile());
File trustFile = new File(Objects.requireNonNull(exampleController.class.getClassLoader().
getResource("example-api.jks")).getFile());
KeyStore keyStore = KeyStore.getInstance("PKCS12");
try(FileInputStream inStream = new FileInputStream(keyFile)) {
keyStore.load(inStream, "password".toCharArray());
}
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(trustFile, "password".toCharArray() ,new TrustAllStrategy()).
loadKeyMaterial(keyStore , "password".toCharArray()).build();
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
SSLConnectionSocketFactory socketFactory =
new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLHostnameVerifier(hostnameVerifier)
.setSSLSocketFactory(socketFactory)
.useSystemProperties()
.build();
HttpGet httpget = new HttpGet("https://example-api/link?token=@Secret_Token@");
System.out.println("executing request" + httpget.getRequestLine());
return httpclient.execute(httpget);
上面的代码总是 returns 400(未发送所需的 SSL 证书)。
但以下卷曲有效(在 IOS 上):
curl https://example-api/link?token=@secret_token@ --cacert ./example-api-ca.crt --cert ./example-client-api1.p12:password
如有任何帮助,我们将不胜感激
好的所以在一些令人沮丧的日子之后:
我不知道原因,但问题出在 URL 的主机名中的连字符字符 ('-'),删除连字符符号解决了问题,不知道为什么,但无论如何发布它,也许有人可以解释这个现象。
示例(使用上面的代码):
example-api -> not working
example.api -> Works OK
我有一个 ssl 连接(2 次握手),我无法理解为什么以下代码程序 400(openJdk 11,服务器提供的 p12 文件和密码,服务器提供的 cer 文件),
我已经通过以下命令从 cer 文件创建了 jks 文件:
keytool -importcert -file example-api.cer -keystore example-api.jks
代码
File keyFile = new File(Objects.requireNonNull(exampleController.class.getClassLoader().
getResource("example-client-api1.p12")).getFile());
File trustFile = new File(Objects.requireNonNull(exampleController.class.getClassLoader().
getResource("example-api.jks")).getFile());
KeyStore keyStore = KeyStore.getInstance("PKCS12");
try(FileInputStream inStream = new FileInputStream(keyFile)) {
keyStore.load(inStream, "password".toCharArray());
}
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(trustFile, "password".toCharArray() ,new TrustAllStrategy()).
loadKeyMaterial(keyStore , "password".toCharArray()).build();
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
SSLConnectionSocketFactory socketFactory =
new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLHostnameVerifier(hostnameVerifier)
.setSSLSocketFactory(socketFactory)
.useSystemProperties()
.build();
HttpGet httpget = new HttpGet("https://example-api/link?token=@Secret_Token@");
System.out.println("executing request" + httpget.getRequestLine());
return httpclient.execute(httpget);
上面的代码总是 returns 400(未发送所需的 SSL 证书)。
但以下卷曲有效(在 IOS 上):
curl https://example-api/link?token=@secret_token@ --cacert ./example-api-ca.crt --cert ./example-client-api1.p12:password
如有任何帮助,我们将不胜感激
好的所以在一些令人沮丧的日子之后: 我不知道原因,但问题出在 URL 的主机名中的连字符字符 ('-'),删除连字符符号解决了问题,不知道为什么,但无论如何发布它,也许有人可以解释这个现象。 示例(使用上面的代码):
example-api -> not working
example.api -> Works OK