2016-07-25 119 views
0

我正在尋找解析VirusTotal URL,因此我試圖打開連接到特定鏈接並閱讀網頁源代碼。VirusTotal HTTPS連接Java

我使用這個代碼

package boot; 

import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.cert.Certificate; 
import java.io.*; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLPeerUnverifiedException; 

public class Run { 
    public static void main(String[] args) { 
     new Run().testIt(); 
    } 
    private void testIt() { 
     String https_url = "https://www.virustotal.com/en/file/7b6b268cbca9d421aabba5f08533d3dcaba50e0f7887b07ef2bd66bf218b35ff/analysis/"; 
     URL url; 
     try{ 
      url = new URL(https_url); 
      HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
      // dumpl all cert info 
      print_https_cert(con); 
      System.out.println(con); 
      // dump all the content 
      print_content(con); 
     } catch(MalformedURLException e){ 
      e.printStackTrace(); 
     } catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 
    private void print_https_cert(HttpsURLConnection con) { 
     if(con != null){ 
      try{ 
       System.out.println(con); 
       System.out.println("Response Code : " + con.getResponseCode()); 
       System.out.println("Cipher Suite : " + con.getCipherSuite()); 
       System.out.println("\n"); 
       Certificate[] certs = con.getServerCertificates(); 
       for(Certificate cert : certs){ 
        System.out.println("Cert Type : " + cert.getType()); 
        System.out.println("Cert Hash Code : " + cert.hashCode()); 
        System.out.println("Cert Public Key Algorithm : " + cert.getPublicKey().getAlgorithm()); 
        System.out.println("Cert Public Key Format : " + cert.getPublicKey().getFormat()); 
        System.out.println("\n"); 
       } 
      } catch(SSLPeerUnverifiedException e){ 
       e.printStackTrace(); 
      } catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
    private void print_content(HttpsURLConnection con) { 
     if(con != null){ 
      try{ 
       System.out.println("****** Content of the URL ********"); 
       BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); 
       String input; 
       while((input = br.readLine()) != null){ 
        System.out.println(input); 
       } 
       br.close(); 
      } catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

,但我得到這個錯誤

Response Code : 200 
Exception in thread "main" java.lang.IllegalStateException: connection not yet open 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getCipherSuite(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getCipherSuite(Unknown Source) 
    at boot.Run.print_https_cert(Run.java:38) 
    at boot.Run.testIt(Run.java:23) 
    at boot.Run.main(Run.java:13) 

我試着做一些測試和調整,但我沒有管理,使其工作。

我也測試了幾個其他網站,它工作得很好。

謝謝。

+0

我試過你的代碼,結果也一樣。我最好的猜測是,virustotal有一些反機器人邏輯,防止服務器返回數據。我試圖添加一個用戶代理到請求,但這也沒有幫助。不知道此時還有什麼可以嘗試的,現在對我來說已經很晚了,所以我會多思考一些,如果想到什麼,請回復您。 –

回答

1

此代碼失敗,因爲沒有標頭的簡單GET請求被VirusTotal「拒絕」。嘗試提供更多信息,如下所示,它將起作用。

private void testIt() { 
    String https_url = "https://www.virustotal.com/en/file/7b6b268cbca9d421aabba5f08533d3dcaba50e0f7887b07ef2bd66bf218b35ff/analysis/";   
    URL url; 
    try{ 
     url = new URL(https_url); 
     HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
     con.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 
     con.setRequestProperty("accept-language", "en-US,en;q=0.8"); 
     con.setRequestProperty("accept", "text/html"); 
     //May need to use connect() if connection is not established 
     //con.connect(); 

     // dumpl all cert info 
     print_https_cert(con); 
     System.out.println(con); 
     // dump all the content 
     print_content(con); 
    } catch(MalformedURLException e){ 
     e.printStackTrace(); 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 
+0

非常感謝,只是複製屬性使其工作,欣賞它。 –