SSL协议异常:读取错误:ssl=0x9af236c0,SSL库中的故障,通常是Android模拟器中的协议错误。

6
我正在使用以下方法来读取流。原始回答翻译成“最初的回答”。
public static String readStream(InputStream inputStream) {
    try {
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        int i = inputStream.read();
        while (i != -1) {
            bo.write(i);
            i = inputStream.read();
        }
        return bo.toString();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
}

我在这行代码处遇到了以下异常

最初的回答:

int i = inputStream.read();

最初的回答:

异常:

javax.net.ssl.SSLProtocolException: Read error: ssl=0x9af236c0: Failure in SSL library, usually a protocol error
2019-03-15 16:25:25.978 5367-5389/com.healics.myhealics W/System.err: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT (external/boringssl/src/crypto/cipher/e_aes.c:1143 0x989b8e9f:0x00000000)
2019-03-15 16:25:25.978 5367-5389/com.healics.myhealics W/System.err: error:1000008b:SSL routines:OPENSSL_internal:DECRYPTION_FAILED_OR_BAD_RECORD_MAC (external/boringssl/src/ssl/tls_record.c:277 0x989b8e9f:0x00000000)
2019-03-15 16:25:25.979 5367-5389/com.healics.myhealics W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
2019-03-15 16:25:25.980 5367-5389/com.healics.myhealics W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:741)
2019-03-15 16:25:25.980 5367-5389/com.healics.myhealics W/System.err:     at com.android.okhttp.okio.Okio$2.read(Okio.java:136)
2019-03-15 16:25:25.980 5367-5389/com.healics.myhealics W/System.err:     at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
2019-03-15 16:25:25.980 5367-5389/com.healics.myhealics W/System.err:     at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:50)
2019-03-15 16:25:25.980 5367-5389/com.healics.myhealics W/System.err:     at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:393)
2019-03-15 16:25:25.980 5367-5389/com.healics.myhealics W/System.err:     at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:371)
2019-03-15 16:25:25.981 5367-5389/com.healics.myhealics W/System.err:     at java.io.BufferedInputStream.fill(BufferedInputStream.java:248)
2019-03-15 16:25:25.982 5367-5389/com.healics.myhealics W/System.err:     at java.io.BufferedInputStream.read(BufferedInputStream.java:267)
2019-03-15 16:25:25.983 5367-5389/com.healics.myhealics W/System.err:     at com.interrahealth.i3user.util.StreamReader.readStream(StreamReader.java:18)

现在,这只发生在模拟器上,当我在真实的Android设备上运行代码时,它不会发生。这是一个间歇性问题,有时候才会出现。

以下是我添加的代码:

我没有添加任何设置SSL/TLS设置的代码,下面是我的代码:

最初的回答

The issue occurs only on the emulator, and not consistently. There is no code for setting up SSL/TLS settings in the provided code.

private static String mGetResponseFromNetworkRequest(String userPass, String apiEndpoint, String
            outputStreamBytes, String requestMethod, String contentType) {
        long startTime = System.currentTimeMillis();
        String response = "";
        Logger.d("apiEndpoint: " + apiEndpoint);
        try {
            HttpURLConnection httpURLConnection = getHttpUrlConnectionWithDigestAuth(apiEndpoint, requestMethod);
            httpURLConnection.setRequestMethod(requestMethod);
            httpURLConnection.setRequestProperty("Content-Type", contentType);
            httpURLConnection.setRequestProperty("Content-Language", "en-US");
            httpURLConnection.setRequestProperty("charset", "utf-8");
            httpURLConnection.addRequestProperty("User-Agent", "XYZ");
            httpURLConnection.addRequestProperty("Full-App-Version", BuildConfig.VERSION_NAME);
            httpURLConnection.addRequestProperty("Platform", "Android");
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setDoOutput(true);

            DataOutputStream dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
            dataOutputStream.writeBytes(outputStreamBytes);

            dataOutputStream.flush();
            dataOutputStream.close();

            Logger.d("dataOutputStream: " + outputStreamBytes);
            Logger.d("Response Code: " + httpURLConnection.getResponseCode());
            Logger.d("httpURLConnection.getHeaderFields(): " + httpURLConnection.getHeaderFields().toString());
            Logger.d("httpURLConnection: " + httpURLConnection.toString());


            // WAS THROWING ERRORS
            if (httpURLConnection.getResponseCode() == 500) {
                return "500";
            } else {
                InputStream inputStream = new BufferedInputStream(httpURLConnection.getInputStream());
                response = StreamReader.readStream(inputStream);
                httpURLConnection.disconnect();
            }

            Logger.d("Result: " + response);

        } catch (MalformedInputException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.d("mGetResponseFromNetworkRequest", "Connection Time = " + (System.currentTimeMillis() - startTime));
        return response;
    }

请提供设置 SSL/TLS 设置的代码。 - James Blackburn
我没有添加任何设置SSL/TLS的代码,以下是我的代码。 - user_8275
1
@user_8275 你是如何解决这个问题的? - Menu
1个回答

0

您需要在HttpsURLConnection上设置setSSLSocketFactory,如下所示:

 httpURLConnection.setSSLSocketFactory(new MyFactory());

在Android API 16及以上版本中,默认情况下未启用TLS 1.1和1.2,因此需要启用它们。上面我们使用了一个名为MyFactory的类,这是您设置SSLContext的位置。这里有一个链接,向您展示需要做什么https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接