2011-10-12 6 views
3

Я уже пялился на эту тему в течение последних нескольких дней. Я пытаюсь передать данные POST на сервер, на котором установлен сертификат SSL.NullPointerException при вызове HTTPS

Я использую 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 

Кто-нибудь знает, что может быть причиной этого? Я немного озадачен на это ..

Edit:

Я думаю, что проблема лежит здесь

Class.forName(String, boolean, ClassLoader) line: 234 
    Class.forName(String) line: 181 

код, кажется, передавая пустую строку в Class.forName() функция , заставляя его выручить. Но я не уверен, что это называется и почему.

Спасибо, Oli

+0

'https: // xxx' -> Вы используете настоящий сервер вместо этого? – Caner

+0

Что делать, если вы пытаетесь изменить EasySslSocketFactory для использования SSLContext.getInstance («По умолчанию») вместо SSLContext.getInstance («TLS»)? – n3utrino

+0

@LAS_VEGAS Hah, да, я использую сервер, на котором установлен действительный SSL-сертификат. – MrNorm

ответ

0

После длительного обсуждения решение

использование IntelliJ IDEA ;-)

+0

Спасибо за ответ. Я не думаю, что мне нужно установить такие вещи на платформе Android, если я что-то не упустил? – MrNorm

+0

Это проблема только в эмуляторе или на устройстве? – n3utrino

+0

Кажется, оба. Я также создал новый проект с только кодом из ответа №1 этого потока в основном действии: http://stackoverflow.com/questions/2012497/accepting-a-certificate-for-https-on-android. Но я получаю ту же проблему как в эмуляторе, так и на моем собственном устройстве. Я должен что-то делать неправильно, или есть проблема с настройкой моей среды. Полностью тупик. – MrNorm

0

Похоже Затмение причиняло вопрос для меня. Как предположил Gabe, идея сообщества Community Intellij компилирует код и не вызывает исключение NullPointerException. Я понятия не имею, что может быть причиной этого, и не знаю, как это исправить. С этого момента я собираюсь использовать другую среду IDE.

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