【发布时间】:2011-10-12 14:40:05
【问题描述】:
最近几天我一直在为这个问题摸不着头脑。我正在尝试将数据发布到安装了 SSL 证书的服务器。
我一直在结合以下代码使用 EasySSLSocketFactory 和 EasyX509TrustManager 类(http://code.google.com/p/transdroid/source/browse/trunk/src/org/xmlrpc/android/?r=103):
StringEntity se = null;
try {
se = new StringEntity(tripArray.toString());
} catch (UnsupportedEncodingException e) { }
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
HttpParams params = new BasicHttpParams();
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));
params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
ClientConnectionManager cm = new SingleClientConnManager(params, schemeRegistry);
this.httpClient = new DefaultHttpClient(cm, params);
HttpPost httpPost = new HttpPost("https://xxx");
httpPost.setEntity(se);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
try {
String response = this.httpClient.execute(httpPost, responseHandler).toString();
} catch (ClientProtocolException e) {
tripFail = true;
} catch (IOException e) {
tripFail = true;
}
但我似乎从我的请求中得到了以下信息:
Thread [<10> Timer-1] (Suspended (exception NullPointerException))
Class.forName(String, boolean, ClassLoader) line: 234
Class.forName(String) line: 181
X509Certificate.<clinit>() line: 60
OpenSSLSocketImplWrapper(OpenSSLSocketImpl).verifyCertificateChain(byte[][], String) line: 658
NativeCrypto.SSL_do_handshake(int, FileDescriptor, NativeCrypto$SSLHandshakeCallbacks, int, boolean) line: not available [native method]
OpenSSLSocketImplWrapper(OpenSSLSocketImpl).startHandshake(boolean) line: 474
OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl) line: 750
OpenSSLSocketImplWrapper(OpenSSLSocketImpl).getInputStream() line: 692
SocketInputBuffer.<init>(Socket, int, HttpParams) line: 98
DefaultClientConnection(SocketHttpClientConnection).createSessionInputBuffer(Socket, int, HttpParams) line: 83
DefaultClientConnection.createSessionInputBuffer(Socket, int, HttpParams) line: 170
DefaultClientConnection(SocketHttpClientConnection).bind(Socket, HttpParams) line: 106
DefaultClientConnection.openCompleted(boolean, HttpParams) line: 129
DefaultClientConnectionOperator.openConnection(OperatedClientConnection, HttpHost, InetAddress, HttpContext, HttpParams) line: 171
SingleClientConnManager$PoolEntry(AbstractPoolEntry).open(HttpRoute, HttpContext, HttpParams) line: 164
SingleClientConnManager$ConnAdapter(AbstractPooledConnAdapter).open(HttpRoute, HttpContext, HttpParams) line: 119
DefaultRequestDirector.execute(HttpHost, HttpRequest, HttpContext) line: 359
DefaultHttpClient(AbstractHttpClient).execute(HttpHost, HttpRequest, HttpContext) line: 555
DefaultHttpClient(AbstractHttpClient).execute(HttpHost, HttpRequest, ResponseHandler, HttpContext) line: 653
DefaultHttpClient(AbstractHttpClient).execute(HttpUriRequest, ResponseHandler, HttpContext) line: 627
DefaultHttpClient(AbstractHttpClient).execute(HttpUriRequest, ResponseHandler) line: 616
DataSender.sendData() line: 151
DataSender$1.run() line: 202
Timer$TimerImpl.run() line: 284
有人知道是什么原因造成的吗?这个我有点懵了。。
编辑:
我认为问题出在这里
Class.forName(String, boolean, ClassLoader) line: 234
Class.forName(String) line: 181
代码似乎将一个空字符串传递给 Class.forName() 函数,导致它退出。但我不确定是什么调用它以及为什么调用它。
谢谢, 奥利
【问题讨论】:
-
https://xxx-> 你用的是真正的服务器而不是这个吗? -
如果您尝试修改 EasySslSocketFactory 以使用 SSLContext.getInstance("Default") 而不是 SSLContext.getInstance("TLS") 怎么办?
-
@LAS_VEGAS 哈,是的,我正在使用安装了有效 SSL 证书的服务器
-
@gabe 试过了,但被告知我不能使用默认实例。我认为问题出在这里 Class.forName(String, boolean, ClassLoader) line: 234 Class.forName(String) line: 181 代码似乎将一个空字符串传递给 Class.forName() 函数,导致它保释out.. 但我不确定是什么叫它以及为什么。
-
可能没有找到 X509Certificate 类?
标签: java android https httpclient x509certificate