https使用httpClient和cert.em发布请求

时间:2015-06-09 12:39:17

标签: java ssl https httpclient ca

我有一段代码将有效负载发送到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)at   java.security.Provider $ Service.newInstance(Provider.java:1245)at   sun.security.jca.GetInstance.getInstance(GetInstance.java:220)at at   sun.security.jca.GetInstance.getInstance(GetInstance.java:147)at   javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)at   javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)at   javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)     ... 22更多引起: java.io.IOException:密钥库格式无效

有什么原因吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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