2015-09-22 32 views
2

我試圖從湯姆索亞冒險隨機線。這裏是我的代碼:javax.net.ssl.SSLHandshakeException:收到致命警報:handshake_failure,當試圖從項目Gutenberg抓取一條隨機線

public static void main(String[] args) { 
     try { 
      Random rand = new Random(); 
      Document doc = Jsoup.connect("https://www.gutenberg.org/files/74/74-h/74-h.htm").timeout(10*1000).get(); 
      String body = doc.select("p").text(); 
      String[] bodytext = body.split("\\."); 
      int randomLine = rand.nextInt(bodytext.length); 
      if (bodytext[randomLine].startsWith(" \"")) { 
       System.out.println("Random line from " + bodytext[randomLine] + ".\""); 
      } 
      else { 
      System.out.println("Random line from " + bodytext[randomLine] + "."); 
      } 

     } catch (IOException ex) { 
      Logger.getLogger(JavaApplication8.class.getName()).log(Level.SEVERE, null, ex); 
     } 

} 

下面是我收到錯誤消息:

SEVERE: null 
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2011) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375) 
    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.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153) 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:512) 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:493) 
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:205) 
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:194) 
    at javaapplication8.JavaApplication8.main(JavaApplication8.java:27) 

第27行是Document doc = Jsoup.connect("https://www.gutenberg.org/files/74/74-h/74-h.htm").timeout(10*1000).get();

什麼錯?幾個月前我做了這件事,而且我沒有任何問題,但是當我回到本週時,我收到了握手失敗錯誤。

回答

0

嘗試,如果可以,更新java。我不知道爲什麼,但jdk1.8.0_25爲我工作,而jdk1.7.0_51和jdk1.7.0_79沒有(這些版本給出了你提到的同樣的錯誤)

我會嘗試進一步調查以改善答案但我希望這可以幫助你。

提示:您可以使用vm參數-Djavax.net.debug=all來獲取有關該錯誤的更多信息。

UPDATE:

正如@ dave_thompson_085指出,在jdk1.7 tls1.2默認情況下禁用。您可以啓用它,但gutenberg.org需要java19.7不支持的TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

我試圖添加他們使用其他提供商沒有運氣,所以...似乎使用jdk1.8是最好的選擇。如果有人在jdk1.7中使用TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,很高興知道。

+1

根據ssllabs的說法,[url] gutenborg.org是152.19.134.47,只接受** TLS1.2 **,他們的證書日期爲9月22日,這表明他們可能已經做出了改變。默認情況下Java 7 SSL客戶端不提供TLS 1.2(或1.1),儘管程序可以改變這種情況,至少假設Jsoup使用默認的SSLSocketFactory並且它看起來似乎。 Java 8客戶端默認提供它們。然而,不管怎樣,我的DNS解析方式不同,我從afilias那裏看到的相當可疑的(klczy.com?)也是如此。 –

+0

謝謝@ dave_thompson_085,你是對的,我正在更新答案 – fonkap

相關問題