1. 程式人生 > >使用https出錯javax.net.ssl.SSLHandshakeException: Handshake failed

使用https出錯javax.net.ssl.SSLHandshakeException: Handshake failed

最近專案中要用到https,android這邊使用的是httpsurlconnection來進行訪問的。其中遇到了一個非常詭異的問題,在此記錄下來,以供參考:

注:https 的證書是後臺自己生成的,沒有申請合法的證書。

出錯日誌:

11-10 16:50:32.933: W/System.err(16031): javax.net.ssl.SSLHandshakeException: Handshake failed
11-10 16:50:32.933: W/System.err(16031): 	at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:435)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.Connection.upgradeToTls(Connection.java:1323)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.Connection.connect(Connection.java:1225)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:395)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:298)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:399)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:110)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:25)
11-10 16:50:32.933: W/System.err(16031): 	at com.example.httpstest.MainActivity.initSSLALL(MainActivity.java:174)
11-10 16:50:32.933: W/System.err(16031): 	at com.example.httpstest.MainActivity$1.run(MainActivity.java:80)
11-10 16:50:32.933: W/System.err(16031): 	at java.lang.Thread.run(Thread.java:818)
11-10 16:50:32.933: W/System.err(16031): Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x7f84498100: Failure in SSL library, usually a protocol error
11-10 16:50:32.933: W/System.err(16031): error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol (external/openssl/ssl/s23_clnt.c:740 0x7f77c0a110:0x00000000)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
11-10 16:50:32.933: W/System.err(16031): 	at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:347)
11-10 16:50:32.933: W/System.err(16031): 	... 11 more

出錯的現象:

首先IOS客戶端上班是沒有問題的。在Android客戶端的程式中,android4.x的跑沒有任何的問題,但是android5.x上邊跑就會一直報上邊的異常,而且後臺伺服器跑的是兩臺tomcat,android5.x在一臺tomcat上跑沒有任何問題,在另一臺tomcat上邊跑一直出錯。理論上IOS上沒有問題說明後臺應該是沒有問題的,但是android 端的5,.x在不同的tomcat上邊跑結果不同說明兩個tomcat的配置是不一樣的,非常糾結這個問題,查了很多的資料也沒有解決,最後查了好多原因才發現確實是後臺的配置沒有配好,原因是其中一臺tomcat上邊的JAVAHOME路徑沒有配好。最終問題解決。特此記錄。

下邊是一個使用https的小demo,需要的可以免費下載使用以下:

點選下載