我正在尝试在HTTPS请求调用中包含SSL证书文件(.crt和.key)。但是这样做时我的握手失败错误。这是我用Java包含文件的代码。客户端期望SSL版本应为TLSv1.2。
public static void main(String[] args){
SSLConnectionSocketFactory socketFactory = null;
String uri = "https://myclient.com";
try {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(
new FileInputStream(new File(
"certificate.p12")),
keyStorePassword.toCharArray());
socketFactory = new SSLConnectionSocketFactory(
new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore, keyStorePassword.toCharArray()).build(),
NoopHostnameVerifier.INSTANCE);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
答案 0 :(得分:-1)
问题是您正在尝试加载pkcs12
文件,而您应该加载keystore
文件。
所以第一步(你已经做过)就是用pkcs12
创建一个pfx
(或openssl
)文件。
openssl pkcs12 -export -out certificate.p12 -inkey privateKey.key -in certificate.crt
现在,您必须使用jks
&{39} keytool
java
的密钥库
keytool -genkey -alias mydomain -keyalg RSA -keystore mykeystore.jks -keysize 2048
您将被问到一堆问题,包括密码。
创建密钥库后,您现在可以导入pkcs12
文件:
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore .\mykeystore.jks -deststoretype JKS
在您的Java
代码中,您必须导入mykeystore.jks
而不是certificate.p12
。
答案 1 :(得分:-1)
在与这个问题争吵了一个多星期后,它已经解决了。我在MacOS上尝试我的代码。由于Apple不赞成使用openssl来支持自己的TLS和加密库,因此握手过程会因更高版本的TLS而失败。
我在ubuntu中尝试了并得到了结果。