【问题标题】:https post request using httpClient and cert.em使用 httpClient 和 cert.em 的 https 发布请求
【发布时间】:2015-08-24 06:50:36
【问题描述】:

我有一段代码将有效负载发送到 https 端点(或应该)。我也有一个 .pem 格式的 CA 链,这是我尝试添加的代码中使用它来执行 POST 的方式。

HttpClient client = new HttpClient();
                Gson gson = new GsonBuilder().setPrettyPrinting().create();
                String jsonString = gson.toJson(parentData);
                Properties systemProps = System.getProperties();
                systemProps.put( "javax.net.ssl.trustStore", "/Users/kaulk/Downloads/djca-2048.pem");
                systemProps.put("javax.net.ssl.trustStorePassword", "changeit");
                System.setProperty("javax.net.ssl.keyStoreType","pkcs12");
                System.setProperties(systemProps);              
                PostMethod method = new PostMethod("https://beta.fcm.fint.xxx.net/notify/BuildNotification");
                StringRequestEntity requestEntity = new StringRequestEntity(
                                jsonString,
                                "application/json",
                                "UTF-8");
                method.setRequestEntity(requestEntity);
                int statusCode = client.executeMethod(method);

但它失败并出现错误:

原因:java.security.NoSuchAlgorithmException:构造错误 实现(算法:默认,提供者:SunJSSE,类: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)在 java.security.Provider$Service.newInstance(Provider.java:1245) 在 sun.security.jca.GetInstance.getInstance(GetInstance.java:220) 在 sun.security.jca.GetInstance.getInstance(GetInstance.java:147) 在 javax.net.ssl.SSLContext.getInstance(SSLContext.java:125) 在 javax.net.ssl.SSLContext.getDefault(SSLContext.java:68) 在 javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102) ... 22 更多原因:java.io.IOException: Invalid keystore format

有什么原因吗?

【问题讨论】:

    标签: java ssl https httpclient ca


    【解决方案1】:

    根据 SSL 属性的文档

    javax.net.ssl.trustStoreType - (可选)用于 Java 密钥库文件 格式,此属性的值为 jks(或 JKS)。你通常不会 指定这个属性,因为它的默认值已经是 jks。

    尝试设置 javax.net.ssl.trustStoreType

    您遇到的异常通常是由于基础错误而引发的。

    这些设置还可以帮助您获取更多信息以进行故障排除 -Djavax.net.debug=ssl,或至少 -Djavax.net.debug=ssl,keymanager

    storeType 应以导入的证书文件为准 有用的帖子 - Java Exception on SSLSocket creation

    【讨论】:

    【解决方案2】:

    您必须先将 CA 证书导入密钥库,然后在“javax.net.ssl.trustStore”中传递密钥库。将证书导入密钥库:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#keytool_option_importcert

    另外,您设置系统属性的方式不一致 - System.setProperties(systemProps) 似乎覆盖了您在上面一行中设置的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2012-12-28
      • 2023-03-04
      • 2019-02-04
      相关资源
      最近更新 更多