2015-12-04 70 views
1

我是REST的新手,我最近開發了一個小的Java REST客戶端以通過SSL使用api (https)使用球衣。然而,我的挑戰與下面的錯誤:線程「主」異常javax.ws.rs.ProcessingException:javax.net.ssl.SSLProtocolException:握手警報:無法識別的名稱

異常線程 「main」 javax.ws.rs.ProcessingException:javax.net.ssl.SSLProtocolException:握手警報:unrecognized_name ........ ........ 引起:javax.net.ssl.SSLProtocolException:handshake alert:unrecognized_name

我從一些關於在java中禁用SNI的帖子閱讀,但我不清楚。 由於我使用的是eclispe IDE,我在eclipse.ini文件中添加了「-Djsse.enableSNIExtension = false」,但仍然出現錯誤。 任何人都可以指向正確的方向嗎?

+0

我用的是'System.setProperty( 「jsse.enableSNIExtension」, 「假」);'但不再適用於'Java版本握手異常 「1.7.0_79」 OpenJDK的運行時環境(IcedTea項目2.5 .6)(7u79-2.5.6-0ubuntu1.14.04.1)'。 – PLA

+0

@PLA,謝謝。我正在使用java版本「1.8.0_66」 Java(TM)SE運行時環境(build 1.8.0_66-b18)。我不確定最好的解決方案,在過去的24小時內一直在使用Google搜索! – SyCode

+0

'-Djsse.enableSNIExtension = false'可能在放在'eclipse.ini'中時不起作用。如果您在Eclipse中運行應用程序,則此參數應該位於應用程序的運行配置選項中。 – Bruno

回答

0

我意識到有必要處理這個異常(「使用javax。 net.ssl.SSLProtocolException:handshake alert:unrecognized_name「),方法是將安全性上下文設置爲」TLSv1「並使用TrustManager和HostnameVerifier(請參閱下面的代碼段)。這解決了我的問題。

 SSLContext sc = SSLContext.getInstance("TLSv1"); 
     System.setProperty("https.protocols","TLSv1"); 

     TrustManager[] trustAllCerts = {new InsecureTrustManager()}; 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HostnameVerifier allHostsValid = new InsecureHostnameVerifier(); 
+1

您真的*想要使用不安全的信任管理器和主機名驗證程序嗎? – Bruno

+0

@布魯諾,因爲這不是在生產環境中,目前的方法已經足夠。 – SyCode

+0

由你決定......這種解決方法的問題在於它們通常最終在生產代碼中未被注意到。 (很容易忘記重新進行適當的驗證,特別是如果您已接近截止日期並且沒有時間來安全地完成任務。) – Bruno