2016-02-25 2 views
1

У меня есть кусок кода в Android приложение, которое отправляет данные на мой сервер (к HTTPS URL), как, например:ASN.1Exception в Android при отправке данных на сервер

private void sendData(String serverUrl, byte[] message) { 

    HttpURLConnection conn = null; 

    try { 
     URL url = new URL(serverUrl); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("POST"); 
     conn.setFixedLengthStreamingMode(message.length); 
     conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 
     conn.setRequestProperty("X-Requested-With", "XMLHttpRequest"); 

     OutputStream os = new BufferedOutputStream(conn.getOutputStream()); 
     os.write(message); 

     os.flush(); 
     conn.connect(); 

    } catch (Exception e) { 
     //TODO: log exception and continue gracefully 
    } finally { 
     if (conn != null) 
      conn.disconnect(); 
    } 
} 

Однако я продолжаю видеть следующее исключение происходит время от времени эпизодически на некоторых устройствах (обычно Samsung с Jelly Beans версии [SDK 16, 17 или 18]):

org.apache.harmony.security.asn1.ASN1Exception: Wrong content for ASN.1 integer at [15]. 
An integer MUST be encoded in minimum number of octets 
java.lang.RuntimeException: org.apache.harmony.security.asn1.ASN1Exception: 
Wrong content for ASN.1 integer at [15]. An integer MUST be encoded in minimum number of octets 
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:586) 
    at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method) 
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371) 
    at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209) 
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) 
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) 
    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
    at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188) 
    at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:281) 
    at com.myapp.Reporter.sendData(Reporter.java:45) 

Я искал в интернете и Google с высоким и низким, но не смог выяснить, что это значит или как его решить.

У кого-нибудь есть идеи?

+0

Я предлагаю вам использовать библиотеку волейбола для всех ваших сетевых вызовов. Его простой в использовании и менее сложный. Http: //developer.android.com/training/volley/index.html – Arshad

+0

Спасибо. Однако мой код находится в качестве третьей стороны в приложении, я не могу предположить, что он использует залп, и я не хочу добавлять его в качестве зависимости. –

ответ

0

Хорошо, я, наконец, понял это.

Проблема была в SSL-сертификате моего сервера, поэтому я был единственным сторонним участником в получении этой ошибки (мои коллеги не столкнулись с этой проблемой).

В основном проблема заключается в том, что мой сертификат был приобретен GeoTrust Root CA, который не был установлен как доверенный орган на некоторых устройствах Jelly Bean, поэтому я видел это исключение только из API 16-18, а также Android Jelly Bean ,

Я также нашел подтверждение для этого в комментарии, отправленном на ответ another SO question, который решил проблему с другой точки зрения (я понятия не имел, что это касается сертификатов).

Увидеть, что я не могу (= не хочу) устанавливать сертификат на чье-то устройство, поскольку, как ошибка возникает периодически на старых устройствах и не более 5-6 раз в день (обычно один или два раза норма), я не видел необходимости покупать другой сертификат у органа, который определен как доверенный в устройствах Jelly Bean. Кроме того, по этим причинам я решил не справляться с этой проблемой и в основном потерять данные, поступающие с этих устройств, поскольку они составляют менее 1% пользователей. Я должен отметить, конечно, что я уловил эти исключения и отправил их мне, но они не сбой приложения, поэтому я чувствую себя более комфортно, не обращаясь с этим вопросом.

0

Ошибка, указывающая на то, что некоторые плохие данные были обнаружены, по-видимому, в сертификате безопасности. Там ошибка сообщает вам, что ASN.1 требует, чтобы определенное числовое значение было закодировано в минимальном количестве октетов (байтов). Либо это не было сделано (данные сертификата неверны), либо Harmony неправильно сообщает об ошибке.

+0

Да, спасибо, я это понял. Я просто не понимаю, почему это происходит. Ни одно из других [https] сетевых запросов не выдает это исключение. –

Смежные вопросы