D'abord, j'ai déjà cherché sur Internet et j'ai débogué pendant 3 jours.Obtenir javax.net.ssl.SSLHandshakeException: Connexion fermée par les pairs dans Android 5.0.2
Ceci est l'erreur exacte,
javax.net.ssl.SSLHandshakeException: Connection closed by peer
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:302)
at com.android.okhttp.Connection.upgradeToTls(Connection.java:197)
at com.android.okhttp.Connection.connect(Connection.java:151)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:208)
at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
at com.aws.wiremo.common.CommonFunctions.sendRequestEx(CommonFunctions.java:618)
at com.aws.wiremo.common.CommonFunctions.sendRequest(CommonFunctions.java:556)
at com.aws.wiremo.screen.kdo.LoadingScreen$MakeRequest.doInBackground(LoadingScreen.java:146)
at com.aws.wiremo.screen.kdo.LoadingScreen$MakeRequest.doInBackground(LoadingScreen.java:125)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Pour des raisons de confidentialité, je ne peux pas poster les codes. Il n'y a pas d'exception causée par le StackTrace, donc je ne peux pas vraiment diagnostiquer le problème.
Voici quelques informations que je peux partager.
- demande est envoyée à https://[IP_address]:443/
- J'envoie une demande à un matériel spécial, comme un boîtier de commande. Je peux seulement écrire et récupérer des données via des requêtes POST.
- La chaîne de certificats que je reçois dans la méthode checkServerTrusted de mon CustomTrustManager a un CN qui n'est pas une adresse IP et pas un DNS, plus comme un mot seulement (c'est-à-dire CN = commonname).
- Mon HostNameVerifier est ALLOW_ALL_HOSTNAME_VERIFIER temporairement (ce qui pourrait résoudre le problème avec la 3ème info?).
- J'utilise SSLContext.getInstance ("TLS") et mes protocoles sont TLSv1, TLSv1.1 et TLSv1.2.
- Le certificat utilisé est auto-signé.
- Dans la méthode checkServerTrusted, la chaîne X509Certificate est toujours approuvée par un gestionnaire de confiance (j'ai créé un trustManager qui fait toujours confiance au certificat).
Toutes les entrées seront appréciées.