gpt4 book ai didi

java - 仍然收到致命警报 : bad_certificate ,

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:25 27 4
gpt4 key购买 nike

我将 key 和证书(组合)放入一个 cert.pem 文件中,我得到,“异常”:“javax.net.ssl.SSLHandshakeException”,"message": "收到致命警报:bad_certificate",pem 文件是正确的,但我认为问题是我如何生成 jks keystore 文件。

.pem 证书格式

BEGIN CERTIFICATE

...

END CERTIFICATE

BEGIN CERTIFICATE

...

END CERTIFICATE

BEGIN RSA PRIVATE KEY

...

END RSA PRIVATE KEY###`

结合keytool comand comand is

keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks

java代码是

public class HttpsTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub

}

@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}

请求是

FileInputStream instream = new FileInputStream(
new File(this.resourcePath()+"/path_to.jks")
);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(instream, "password".toCharArray());

SSLContext sslContext = SSLContexts.custom()
.loadKeyMaterial(keyStore, "password".toCharArray()) // use null as second param if you don't have a separate key password
.build();

sslContext.init(null,new X509TrustManager[]{new HttpsTrustManager()}, new SecureRandom());


HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();
HttpResponse response = httpClient.execute(
new HttpPost("https://url")
);
HttpEntity entity = response.getEntity();

System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(entity);

最佳答案

当您使用 Apache SSLContexts.custom().loadKeyMaterial().build() 时,它会使用指定的 keystore 和默认的信任管理器初始化构建的上下文。然后调用 sslContext.init()重新-使用 no keymanager 和指定的 trustmanager 对其进行初始化;这将忽略并丢弃先前的初始化。因此,您的上下文没有 key 管理器,无法进行客户端身份验证。

你需要保持一致。要么使用 Apache 并给(相同的)构建器 both loadKeyMaterial and loadTrustMaterial 对应于你想要的 - 在特定的 httpclient 4.5.4 添加了 org.apache.http.conn.ssl.TrustAllStrategy 实现“愉快地让所有小偷和骗子看到并更改我所谓的安全数据”。或者,使用 JSSE 直接创建一个 SSLContext.getInstance().init() 它(一次!)你的零安全trustmanager 和一个从你的 keystore 创建的 key 管理器(如果你愿意,还有一个显式的 SecureRandom 但如果你忽略它默认)。

但是,这可能不起作用,因为仅当 yourdomain 是与您导入的证书链匹配的预先存在的 PrivateKeyEntry 时,您显示的 keytool 命令才是正确的。使用 keytool -list -alias yourdomain 确保它是 PrivateKeyEntry 而不是 TrustedCertEntry。如果没有,并且如果您需要使用 PEM 文件中的私钥(而不是已经在 keystore 中的私钥),您需要首先使用 OpenSSL 将 key 证书链转换为 PKCS12,然后根据您的 Java 可能使用 keytool 将 PKCS12 转换为 JKS。为此,在几个堆栈上有几十个 Q(和 A)。

关于java - 仍然收到致命警报 : bad_certificate ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50449900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com