25

Ciao Sto lavorando su app Android in cui ho integrato bigquery. A volte vedo che stiamo ottenendo molte eccezioni SSL durante l'inserimento di dati in tabelle di query di grandi dimensioni. Non so come gestirlo. Si prega di aiutare qual è esattamente la causa di questo problema. Ecco lo stesso filo ma nessuna risposta Bigquery SSL error while doing streaming insert api calljavax.net.ssl.SSLHandshakeException: connessione chiusa host remoto durante l'handshake durante l'inserimento di righe in bigquery

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946) ~[na:1.7.0_51] 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) ~[na:1.7.0_51] 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) ~[na:1.7.0_51] 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) ~[na:1.7.0_51] 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) ~[na:1.7.0_51] 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) ~[na:1.7.0_51] 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091) ~[na:1.7.0_51] 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) ~[na:1.7.0_51] 
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77) ~[google-http-client-1.19.0.jar:1.19.0] 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965) ~[google-http-client-1.19.0.jar:1.19.0] 
    at com.google.api.client.googleapis.batch.BatchRequest.execute(BatchRequest.java:241) ~[google-api-client-1.19.1.jar:1.19.1] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor$$anonfun$2$$anonfun$4.apply(InsertApiActor.scala:131) ~[analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor$$anonfun$2$$anonfun$4.apply(InsertApiActor.scala:118) ~[analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.common.store.bigquery.api.BigQueryApi$.withSyncClient(BigQueryApi.scala:71) ~[analytics-common_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor$$anonfun$2.apply$mcV$sp(InsertApiActor.scala:118) ~[analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor$$anonfun$2.apply(InsertApiActor.scala:115) ~[analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor$$anonfun$2.apply(InsertApiActor.scala:115) ~[analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.common.monitoring.Timer.time(Timer.scala:15) ~[analytics-common_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor.com$livestream$analytics$datastorage$worker$InsertApiActor$$insertDataRowsToBigQueryTable(InsertApiActor.scala:115) [analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor$$anonfun$receive$1.applyOrElse(InsertApiActor.scala:80) [analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at akka.actor.Actor$class.aroundReceive(Actor.scala:465) [akka-actor_2.11-2.3.9.jar:na] 
    at com.livestream.analytics.datastorage.worker.InsertApiActor.aroundReceive(InsertApiActor.scala:54) [analytics-data-storage-worker_2.11-1.0.0.jar:1.0.0] 
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) [akka-actor_2.11-2.3.9.jar:na] 
    at akka.actor.ActorCell.invoke(ActorCell.scala:487) [akka-actor_2.11-2.3.9.jar:na] 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:254) [akka-actor_2.11-2.3.9.jar:na] 
    at akka.dispatch.Mailbox.run(Mailbox.scala:221) [akka-actor_2.11-2.3.9.jar:na] 
    at akka.dispatch.Mailbox.exec(Mailbox.scala:231) [akka-actor_2.11-2.3.9.jar:na] 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.5.jar:na] 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.5.jar:na] 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.5.jar:na] 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.5.jar:na] 
Caused by: java.io.EOFException: SSL peer shut down incorrectly 
    at sun.security.ssl.InputRecord.read(InputRecord.java:482) ~[na:1.7.0_51] 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) ~[na:1.7.0_51] 
    ... 30 common frames omitted 
+1

Se si dispone di un mezzo per riprodurre il problema in modo affidabile e si ha motivo di ritenere che non sia colpa della propria applicazione, è necessario segnalare il problema con tutto il codice e le tracce di stack che è possibile fornire nel [tracker dell'emissione pubblica per BigQuery] (https://code.google.com/p/google-bigquery/issues/list). A quel punto sarà analizzato dagli ingegneri di supporto e indirizzato in proporzione alla gravità, al numero di persone che hanno recitato il problema e a quanto è nuovo. – Nick

+0

Sei riuscito a creare un thread di monitoraggio di problemi pubblici, o hai fatto progressi nel debug di questo? Se il problema è completamente opaco (e sembra che non ci sia nulla che tu possa fare, dato che il peer SSL è stato chiuso in modo errato), allora questo è il miglior modo di agire per ottenere questo risultato. Assicurati di includere il maggior numero di registri o codici pertinenti che puoi. – Nick

+0

Ho anche affrontato questa eccezione una volta. Quindi l'ho risolto usando la volley api. se vuoi, allora posso condividere il codice. – hitesh141

risposta

1

Probabilmente il server sta chiedendo un certificato client e non si fornisce uno. Il server fornirà un elenco di firmatari attendibili e il certificato del cliente dovrà essere firmato da uno di questi. Non è possibile utilizzare un certificato autofirmato per il cliente a meno che non si siano presi accordi speciali con il server, ovvero importato il certificato client nell'elenco dei certificati attendibili. Il tuo client SSL non invierà un certificato se non è in grado di trovarne uno, o se il (i) che trova non ha firme attendibili.

Non ha nulla a che fare con ciò che la connessione SSL stava per fare dopo che è stata stabilita, ad es. Query SQL, aggiornamenti, ecc.

0

Se si utilizzano richieste (https) è necessario aggiungere certificato di sicurezza nella propria app. ecco il link come aggiungerlo.

http://stackoverflow.com/questions/4065379/how-to-create-a-bks-bouncycastle-format-java-keystore-that-contains-a-client-c

È possibile verificare se effettivamente certificato di sicurezza è la causa, Aggiungi questa classe nel progetto.

import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 


public class HttpsTrustManager implements X509TrustManager { 

    private static TrustManager[] trustManagers; 
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{}; 

    @Override 
    public void checkClientTrusted(
      java.security.cert.X509Certificate[] x509Certificates, String s) 
      throws java.security.cert.CertificateException { 

    } 

    @Override 
    public void checkServerTrusted(
      java.security.cert.X509Certificate[] x509Certificates, String s) 
      throws java.security.cert.CertificateException { 

    } 

    public boolean isClientTrusted(X509Certificate[] chain) { 
     return true; 
    } 

    public boolean isServerTrusted(X509Certificate[] chain) { 
     return true; 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return _AcceptedIssuers; 
    } 

    public static void allowAllSSL() { 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 

      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return true; 
      } 

     }); 

     SSLContext context = null; 
     if (trustManagers == null) { 
      trustManagers = new TrustManager[]{new HttpsTrustManager()}; 
     } 

     try { 
      context = SSLContext.getInstance("TLS"); 
      context.init(null, trustManagers, new SecureRandom()); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } 

     HttpsURLConnection.setDefaultSSLSocketFactory(context 
       .getSocketFactory()); 
    } 

} 

e chiamare

HttpsTrustManager.allowAllSSL(); // Allow all SSL connections 

prima una chiamata API.

NOTA: Questo codice salta la verifica e consente a qualsiasi certificato di funzionare. Questo metodo non deve essere utilizzato per comunicazioni sicure. Serve solo per verificare se l'autenticazione del certificato sta causando l'errore.

+1

Questo codice non sicuro non verifica se il server richiede un certificato client. – EJP

+0

Se questa domanda riguarda i certificati client, questa riga 'context.init (null, trustManagers, new SecureRandom());' è decisamente sbagliata; il parametro 'null' è il' KeyManager' che può fornire il certificato client. – EpicPandaForce

Problemi correlati