2016-02-25 71 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(); 
    } 
} 

然而,我一直看到發生不時偶爾在某些設備上(通常與三星糖豆版本[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) 

我在網上搜索和谷歌高,低,但不能弄清楚這意味着什麼或如何解決它。

任何人有任何想法?

+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]網絡請求都不會引發此異常。 –

相關問題