【问题标题】:javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake abortedjavax.net.ssl.SSLHandshakeException:javax.net.ssl.SSLProtocolException:SSL握手中止
【发布时间】:2013-09-16 10:32:13
【问题描述】:

我一直在寻找这个问题的解决方案,但我似乎无法弄清楚

我正在尝试在 android 应用程序和服务器之间通过 http 连接使用 ssl, 我用我的自签名证书创建了一个密钥库

我有这个代码:

    URL url;
    SSLContext sslContext = null;
    KeyStore keyStore = KeyStore.getInstance("BKS");    
    InputStream input = SportsApplication.getContext().getResources().openRawResource(R.raw.mykeystore);
    keyStore.load(input, "mypass".toCharArray());
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
    kmf.init(keyStore, "mypass".toCharArray());
    KeyManager[] keyManagers = kmf.getKeyManagers();
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyManagers, null, null);

    HttpsURLConnection connection = null;
    String urlParameters = mJObject.toString();
    try {
        Log.w("client", mUrl);
        Log.v("client", "request: "+urlParameters);
        // Create connection
        mUrl = mUrl.replaceFirst("http", "https");
        url = new URL(mUrl);
        connection = (HttpsURLConnection) url.openConnection();
        try{

            connection.setSSLSocketFactory(sslContext.getSocketFactory());
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }
        try{
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json");
        connection.setRequestProperty("Accept", "application/json");
        connection.setReadTimeout(dataTimeout);
        connection.setConnectTimeout(com.inmobly.buckeyes.client.Constants.DEFAULT_CONN_TIMEOUT);

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }
        // Send request
        DataOutputStream wr = null;
        try{
         wr = new DataOutputStream(connection.getOutputStream());
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }

但我不断收到此异常:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x1b1b0e0: Failure in SSL library, usually a protocol errorerror:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4029bcf5:0x00000000)

我做错了什么?

【问题讨论】:

  • 我也有同样的问题。 @Yasmin Reda 你找到答案了吗?

标签: java android ssl apache2


【解决方案1】:

由于 SSL 握手本身没有通过,所以您可以在您的系统上安装wireshark(这也可以在模拟器上重现),而不是使用异常中的信息对其进行调试(它也可以在模拟器上重现)并查看数据包捕获操作系统级别。如果错误是由于服务器和客户端的 ssl 实现之间的协议版本不匹配,则数据包应该具有必要的信息。您可以先尝试一个简单的 ssl 握手,以确保与服务器正确握手。让我们知道您获得的信息,我们将进一步调试!

【讨论】:

  • 总是很高兴看到这样的 cmets :) 继续摇滚。
  • @Bhavit 你能分享一下那是什么错误吗?我在较低版本的android上遇到了同样的问题。从 SO 在 NoSSlFactory 中实现。但还是不行。
  • @VindhyaPratapSingh 我在这里写了一个关于该错误的答案:stackoverflow.com/questions/29916962/…
  • 感谢@Bhavita,我的问题已通过更改服务器端的 SSL 协议得到解决。我的设备具有 API 级别 15,如文档中所述,它只能支持 TLSv1。该协议在服务器端 SSL 证书上被禁用。所以启用后。它工作正常。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-20
    • 2015-07-07
    • 2015-11-18
    • 2016-04-02
    • 2016-10-19
    • 2015-04-05
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多