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

标签 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();
    }

最佳答案

问题是您正在尝试加载一个 pkcs12 文件,而您应该加载一个 keystore 文件。

所以第一步(您已经做过)是使用 openssl 创建一个 pkcs12(或 pfx)文件。

openssl pkcs12 -export -out certificate.p12 -inkey privateKey.key -in certificate.crt 

现在您必须使用javakeytool 创建一个符合jks 的 keystore 。

keytool -genkey -alias mydomain -keyalg RSA -keystore mykeystore.jks -keysize 2048

你会被问到一堆问题,包括密码。

创建 keystore 后,您现在可以导入 pkcs12 文件:

keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore .\mykeystore.jks -deststoretype JKS

在您的 Java 代码中,您必须导入 mykeystore.jks 而不是 certificate.p12

关于java - 如何在 Java 的 HTTPS 请求调用中包含 SSL 证书文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48557606/

相关文章:

java - 从异步 rest 模板 spring 返回值

java - Spring中List到Page的转换

java - 如何导入javax.jnlp.*?

ssl - 混合 SSL 证书

为 RapidSSL 数字证书设置 APR 连接器的 Tomcat 6

java - 如何使用 lambda 编写新的 ListChangeListener<Item>()?

Android HTTPS 错误没有受信任的服务器证书

android - 使用自签名 SSL 证书时出现 SSLPeerUnverifiedException

ssl - Nginx、LetsEncrypt - [emerg] "ssl_certificate"指令在/etc/nginx/sites-enabled/example.com.conf :33 nginx: 中不允许

java - 如何在当前打开的编辑器中将特定字符串替换为另一个字符串?