javax.net.ssl.SSLHandshakeException : javax.net.ssl.SSLProtocolException:SSL 握手中止

标签 java android ssl apache2

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

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

我有这段代码:

    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)

我做错了什么?

最佳答案

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

关于javax.net.ssl.SSLHandshakeException : javax.net.ssl.SSLProtocolException:SSL 握手中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18825871/

相关文章:

java - 我应该如何在 Eclipse 中向 Android 个人词典添加单词?

java - 接收广播 Intent 时出错 { act=android.net.wifi.SCAN_RESULTS }

javascript - 从 android webview 触发 JavascriptInterface

android - 与 GCM 通信时返回 HTTP 代码 400

android - StopSelf 不会停止我的服务

java - 将信任链导入 key 对或将其导入 keystore 或两者

java - 将某些类的 Java 集合转换为字符串集合

python - 使用 SSL : pexpect spawn/expect doesn't work 在 apache 上运行 django 应用程序

Java JSSE RMI SSL 文件被拒绝访问

java - 调用 entityManager.getTransaction() 时出现 EJBException