Creator打包報 javax.net.ssl.SSLException: Received fatal alert: protocol_version異常

1、發現問題

  今天在家裏打包apk時,上來就報了異常,仔細一看是如下錯誤:

Exception in thread “main” java.lang.RuntimeException: javax.net.ssl.SSLException: Received fatal alert: protocol_version
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78)
at org.gradle.wrapper.Install.createDist(Install.java:47)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at org.gradle.wrapper.Download.downloadInternal(Download.java:59)
at org.gradle.wrapper.Download.download(Download.java:45)
at org.gradle.wrapper.Install$1.call(Install.java:60)
at org.gradle.wrapper.Install$1.call(Install.java:47)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
… 3 more
執行命令出錯,返回值:1。

2、知識準備與問題分析

就是TLS協議版本的警報,講到這裏不得不提一下,乍一看有點蒙,先了解一下常識:

2.1、知識準備

2.1.1、知識準備 什麼是TLS

  SSL 是“Secure Sockets Layer”的縮寫,中文叫做“安全套接層”。它是在上世紀90年代中期,由網景公司設計的。(順便插一句,網景公司不光發明了 SSL,還發明瞭很多 Web 的基礎設施——比如“CSS 樣式表”和“JS 腳本”)。
  爲啥要發明 SSL 這個協議捏?因爲原先互聯網上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是爲了解決這些問題。
  到了1999年,SSL 因爲應用廣泛,已經成爲互聯網上的事實標準。IETF 就在那年把 SSL 標準化。標準化之後的名稱改爲 TLS(是“Transport Layer Security”的縮寫),中文叫做“傳輸層安全協議”。
  很多相關的文章都把這兩者並列稱呼(SSL/TLS),因爲這兩者可以視作同一個東西的不同階段。

2.1.2、TLS有哪些版本、JDK默認支持哪些版本?

  TLS版本有:

  • SSLv2
  • SSLv3
  • TLSv1
  • TLSv1.1
  • TLSv1.2
      其中 SSLv2、SSLv3應該沒有在用的,一些公司都已經禁用。TLSv1、TLSv1.1 目前還有公司在用,不過很過公司開始陸續禁用。

2.1.3、JDK支持的tls版本:

在這裏插入圖片描述

2.2、問題分析:

  觀察圖表我們發現目前從JDK1.8開始都默認TLSv1.2協議了。但對於還在用版本低的JDK時,如果服務端禁用了TLSv.1 ,而代碼中沒有指定具體協議版本,那麼JDK都是採用默認版本建立連接。這樣會出現以下錯誤:

javax.net.ssl.SSLException: Received fatal alert: protocol_version

  出現此類錯誤,有可能就是服務端和客戶端協議版本不一致導致的。

3、解決問題

  於是檢查了我的JDK版本,發現是JDK7,然後卸載了當前的JDK重新下載並安裝了JDK8,折騰了半天!重新編譯,沒有報異常了!這裏我使用的Creator版本是2.2.0

4、結束語


The End
  好了,今天的分享就到這裏,如有不足之處,還望大家及時指正,隨時歡迎探討交流!!!


喜歡的朋友們,請幫頂、點贊、評論!您的肯定是我寫作的不竭動力!

發佈了75 篇原創文章 · 獲贊 56 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章