使用 Apache Http Client 4.5.3 从 jdk1.6.0_45 到 API Gateway 的简单 POST 请求

Posted

技术标签:

【中文标题】使用 Apache Http Client 4.5.3 从 jdk1.6.0_45 到 API Gateway 的简单 POST 请求【英文标题】:Simple POST request to API Gateway from jdk1.6.0_45 using Apache Http Client 4.5.3 【发布时间】:2018-03-23 05:02:12 【问题描述】:

你好,

我正在尝试使用 Apache Http Client 4.5.3 从 jdk1.6.0_45 向 API Gateway 发送 POST 请求

public class App 

public static void main(String[] args) throws IOException 
    System.setProperty("javax.net.debug", "ssl");

    HttpClient connection = HttpClientBuilder.create().build();
    String url = "https://76mpviml3c.execute-api.us-east-1.amazonaws.com/agstage/";
    HttpPost request = new HttpPost(url);

    connection.execute(request);

我得到 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure。

你能帮我理解我做错了什么吗?

顺便说一句:AmazonS3Client (aws-java-sdk-s3 rev="1.11.109") 在 jdk1.6.0_45 上运行良好

日志:

触发 SecureRandom 播种 完成播种 SecureRandom 允许不安全的重新协商:错误 允许遗留问候消息:true 是否是初始握手:true 是否安全重新协商:错误 %% 没有缓存的客户端会话 *** 客户端你好,TLSv1 RandomCookie: GMT: 1490949205 字节 = 187, 178, 36, 198, 107, 55, 182, 178, 107, 167, 74, 180, 59, 166, 13, 66, 247, 17, 201, 9, 36, 195、234、237、68、23、124、177 会话 ID: 密码套件:[SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 压缩方式:0


主要,写入:TLSv1 握手,长度 = 75 线程“主”javax.net.ssl.SSLHandshakeException 中的异常:收到致命警报:handshake_failure 在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199) 在 org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:396) 在 org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355) 在 org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) 在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359) 在 org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381) 在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) 在 org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) 在 org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) 在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) 在 App.main(App.java:18) 主要,阅读:TLSv1 警报,长度 = 2 主要,RECV TLSv1 ALERT:致命,handshake_failure 主要的,称为 closeSocket() 主要,处理异常:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

【问题讨论】:

【参考方案1】:

我在使用 AWS + Java7 + HTTPClient4.3 时遇到了类似的问题;将 Apache HTTPClient 升级到 v4.5.7 修复了它。看看这个版本是否解决了你的问题。

【讨论】:

以上是关于使用 Apache Http Client 4.5.3 从 jdk1.6.0_45 到 API Gateway 的简单 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 httpclient 4.1.2 连接到 https 会产生 org.apache.http.client.ClientProtocolException

org.apache.http.client.HttpClient使用方法

java 使用Apache 4.5的方法

安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection

Java中的httpclient4.5应该怎么使用?

Android studio没有org.apache.http.client.HttpClient;等包问题 解决方案