Java-HttpClient中的Curl-cacert等价物

Java-HttpClient中的Curl-cacert等价物,java,ssl,curl,apache-httpclient-4.x,truststore,Java,Ssl,Curl,Apache Httpclient 4.x,Truststore,我可以毫无问题地执行以下curl命令: curl-s--cacert cert_ca.pem-X POST--data urlencode name=abcdehttps://abcd.com/resource 你能帮我想出一些关于Java的方法来达到同样的效果吗?我看过类似的帖子,但他们谈论的是完整的SSL握手。在这里,我只是展示CA证书以使用指定的证书文件来验证对等方 另一个问题,我的理解是否正确-->在这里,我只需要使用CA证书配置truststore,以验证对等方,而不必验证任何密钥库,

我可以毫无问题地执行以下curl命令:

curl-s--cacert cert_ca.pem-X POST--data urlencode name=abcdehttps://abcd.com/resource

你能帮我想出一些关于Java的方法来达到同样的效果吗?我看过类似的帖子,但他们谈论的是完整的SSL握手。在这里,我只是展示CA证书以使用指定的证书文件来验证对等方

另一个问题,我的理解是否正确-->在这里,我只需要使用CA证书配置truststore,以验证对等方,而不必验证任何密钥库,因为我没有代表我提供任何证书

多谢各位

我也有CA证书的jks文件

使用以下代码尝试Robert的建议时:

    SSLContext sslContext = SSLContexts.custom()                          
         .loadTrustMaterial(new File("test_ca.jks")
         .build();
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
    httpClient = HttpClients.custom()
         .setSSLSocketFactory(sslsf)
         .build();
    String openEndpoint = "URL";
    HttpPost httpPost = new HttpPost(openEndpoint);
    httpPost.setEntity(new UrlEncodedFormEntity(reqBodyParams)); 
    CloseableHttpResponse httpResponse = ( CloseableHttpResponse ) httpClient.execute(httpPost);
我得到以下例外情况:

    javax.net.ssl.SSLException: Received fatal alert: unexpected_message
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)
at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:1769)
at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:124)
at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:1130)
at sun.security.ssl.ClientHandshaker.sendChangeCipherAndFinish(ClientHandshaker.java:1216)
at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1128)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:348)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:396)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)

在构建Apache Commons Http SSLContext时,可以将Java密钥库文件指定为“信任材料”(信任存储):

    SSLContext sslContext = SSLContexts.custom()
            .loadTrustMaterial(new File("keystore.jks"), "trust-password".toCharArray()) // trust
            .build();
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

我收到
javax.net.ssl.SSLException:收到致命警报:sun.security.ssl.Alerts.getSSLException(Alerts.java:208)上的意外消息
加载信任材料时我没有指定密码,这是唯一的区别。不确定是什么错误,因为我没有把代码放在注释中-它完全不可读。改为编辑您的问题。所以不是论坛!很抱歉,我已经用我的更改和看到的结果更新了问题。这个异常并不冗长,也没有给我任何有用的信息。正如您在curl命令中所看到的,我只需指定CA-cert并进行调用,它就可以工作了。我也应该能够使用java实现同样的功能。如果我有任何误解,请告诉我here@user3688037:您的代码可以正常工作。如果它不起作用,那就是服务器问题(例如错误的url)。上面我没有添加的一行就有问题。。在构造URLEncodedEntity时,我添加了base64编码的键值对,这导致了400个错误请求。你的建议很恰当。谢谢。谢谢