Android 向服务器发送数据时出现 ASN.1Exception

ASN.1Exception in Android while sending data to server

我在 Android 应用程序中有一段代码将数据发送到我的服务器(到 HTTPS url),如下所示:

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();
    }
}

但是,我一直看到在某些设备(通常是带有 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 高低但无法弄清楚这意味着什么或如何解决它。

有人知道吗?

错误告诉您遇到了一些错误数据,显然是在安全证书中。错误告诉您 ASN.1 要求将特定整数值编码为可能的最小八位字节数。要么没有完成(证书数据不正确),要么 Harmony 错误地报告错误。

好吧,我终于想通了。

问题出在我服务器的 SSL 证书上,这就是为什么我是应用程序中唯一出现此错误的第三方(我的同行没有遇到此问题)。

基本上,问题是我的证书是由 GeoTrust Root CA 购买的,它在某些 Jelly Bean 设备上没有作为可信机构安装,这就是为什么我只从 API 16-18 看到这个异常,a.k.a Android果冻豆。

我还在对 another SO question 的回答发表的评论中找到了确认,它从另一个角度解决了这个问题(我不知道这是关于证书的)。

看来我不能(= 不想)在某人的设备上安装证书,因为该错误偶尔会在旧设备上发生并且一天最多 5-6 次(通常是一次或两次)是常态),我认为不需要从 Jelly Bean 设备中定义为受信任的机构购买另一个证书。此外,由于这些原因,我决定不处理这个问题,基本上会丢失来自这些设备的数据,因为他们占用户的比例不到 1%。当然,我应该注意,我正在捕获这些异常并将它们发送给我,但它们并没有使应用程序崩溃,这就是为什么我觉得不处理这件事更舒服。