当前位置: 首页 > 知识库问答 >
问题:

收到致命警报: handshake_failure: javax.net.ssl.SSLHandshakeException

督德泽
2023-03-14

我在Java 8上运行以下代码,

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.JSONObject;

public class HttpPostReq {
public static void main(String args[]) {
    String restUrl = "https://connect-testing.urbanairship.com/api/events/";
    String username = "sample_connection";
    String password = "sample_connection";
    JSONObject jsonToSend = new JSONObject();
    String jsonData = jsonToSend.toString();
    HttpPostReq httpPostReq = new HttpPostReq();
    System.out.println(jsonData);
    HttpPost httpPost = httpPostReq.createConnectivity(restUrl, username, password);
    System.out.println(httpPost);
    httpPostReq.executeReq(jsonData, httpPost);
}

HttpPost createConnectivity(String restUrl, String username, String password) {
    HttpPost post = new HttpPost(restUrl);
    String auth = new StringBuffer(username).append(":").append(password).toString();
    byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
    String authHeader = "Basic " + new String(encodedAuth);
    System.out.println(authHeader);
    post.setHeader("Authorization", authHeader);
    post.setHeader("Content-Type", "application/x-www-form-urlencoded");
    post.setHeader("Accept", "application/vnd.urbanairship+x-ndjson; version=3;");
    post.setHeader("X-Stream", "true");
    return post;
}

void executeReq(String jsonData, HttpPost httpPost) {
    try {
        executeHttpRequest(jsonData, httpPost);
    } catch (UnsupportedEncodingException e) {
        System.out.println("error while encoding api url : " + e);
    } catch (IOException e) {
        System.out.println("ioException occured while sending http request : " + e);
    } catch (Exception e) {
        System.out.println("exception occured while sending http request : " + e);
    } finally {

    }
}

void executeHttpRequest(String jsonData, HttpPost httpPost) throws UnsupportedEncodingException, IOException {
    HttpResponse response = null;
    String line = "";
    StringBuffer result = new StringBuffer();
    httpPost.setEntity(new StringEntity(jsonData));
    HttpClient client = HttpClientBuilder.create().build();
    response = client.execute(httpPost);
    System.out.println("Post parameters : " + jsonData);
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    while ((line = reader.readLine()) != null) {
        result.append(line);
    }
    System.out.println(result.toString());
}
}

获得例外,

ioException 在发送 http 请求时发生:javax.net.ssl.SSLHandshake异常:收到致命警报:handshake_failure。

我能够通过卷曲连接到,

curl -vv https://connect-testing.urbanairship.com/api/events/ \
--compressed \
-u "sample_connection:sample_connection" \
-H "Accept: application/vnd.urbanairship+x-ndjson; version=3;" \
-d "{}"

有人能告诉我我的java代码有什么问题吗?

依赖关系如下,

<dependencies>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20090211</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.2</version>
    </dependency>

共有1个答案

闾丘照
2023-03-14

可能是客户端和服务器使用的 TLS 协议版本或密码套件之间的兼容性问题。

 类似资料:
  • 问题内容: 我正在尝试使用 liferay中的* javapns 库将推送通知发送到我的设备。这是代码: * 调用pushNotification时出现此错误: 我已经用谷歌搜索了,但是找不到任何解决方案。 有谁知道如何解决这个问题? 问题答案: 当您要连接的服务器没有来自授权CA的有效证书时,通常会引发该异常。 简而言之,您尝试连接的服务器很可能使用自签名证书,因此您必须在Java代码中容纳该证

  • 问题内容: 我正在尝试建立SSL套接字连接(并在客户端上执行以下操作) 我生成了证书签名请求以获取签名的客户证书 现在,我有一个私钥(在CSR中使用),一个签名的客户端证书和根证书(带外获得)。 我将私钥和签名的客户端证书添加到证书链中,并将其添加到密钥管理器中。和根证书到信任管理器。但是我收到了错误的证书错误。 我很确定自己使用的证书正确。是否也应该将签名的客户端证书添加到信任管理器?试了一下,

  • 问题内容: 有人遇到过此错误吗?我是SSL新手,我缺少的ClientHello明显有问题吗?没有ServerHello响应时抛出该异常。任何建议表示赞赏。 { http://xml.apache.org/axis/ } stackTrace: … 问题答案: 在Java 1.8上,默认TLS协议为v1.2。在Java 1.6和1.7上,默认的TLS1.0已过时。我在Java 1.8上收到此错误,因

  • 问题内容: 我从两天后尝试了许多选项后发布了这个问题。以下是我尝试的选项。 禁用SSL证书验证 通过从浏览器下载crt并转换为.jks并导入密钥库。 我仍然遇到这个问题,非常感谢您的任何帮助。 问题答案: 问题解决了。!!!以下是解决方案。 对于Java 6:将下面的jar添加到{JAVA_HOME} / jre / lib / ext中。1. bcprov-ext- jdk15on-154.ja

  • 我在使用Java 1.7.0_67的linux服务器上使用Tomcat 7.065和APR 1.1.33。 多年来,我的应用程序一直通过SSL愉快地连接到第三方站点。第三方颁发了一个新证书。第三部分站点是:https://its.changehealthcare.com/ 我下载了。cer文件并导入了一个keytool: 当我做一个keytools列表时,我得到: 但是我继续得到一个ssl握手错误

  • 我正在尝试设置SSL Socket连接(并且正在客户端上执行以下操作) > 我生成证书签名请求以获取签名的客户端证书 现在我有一个私钥(在CSR期间使用)、一个签名的客户端证书和根证书(在带外获得)。 我将私钥和已签名的客户端证书添加到证书链,并将其添加到密钥管理器。并将根证书发送给信任管理器。但是我得到了一个错误的证书。 我很确定我使用的是正确的证书。我是否也应该将已签名的客户端证书添加到信任管