如何在Java中的HTTPS请求调用中包含SSL证书文件

时间:2018-02-01 07:39:43

标签: java ssl

我正在尝试在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();
    }

2 个答案:

答案 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中尝试了并得到了结果。