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%。当然,我应该注意,我正在捕获这些异常并将它们发送给我,但它们并没有使应用程序崩溃,这就是为什么我觉得不处理这件事更舒服。
我在 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%。当然,我应该注意,我正在捕获这些异常并将它们发送给我,但它们并没有使应用程序崩溃,这就是为什么我觉得不处理这件事更舒服。