0

https経由でWebページのhtmlをプルダウンする単純なhttpsクライアントを作成しています。Webページには問題なく接続できますが、プルダウンしたhtmlは意味不明です。

public String GetWebPageHTTPS(String URI){
    BufferedReader read;
    URL inputURI;
    String line;
    String renderedPage = "";
    try{
        inputURI = new URL(URI);
        HttpsURLConnection connect;
        connect = (HttpsURLConnection)inputURI.openConnection();
        connect.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401");
        read = new BufferedReader (new InputStreamReader(connect.getInputStream()));
        while ((line = read.readLine()) != null)
            renderedPage += line;
        read.close();
    }
    catch (MalformedURLException e){
        e.printStackTrace();
    }
    catch (IOException e){
        e.printStackTrace();
    }
    return renderedPage;
}

https://kat.ph/のような文字列を渡すと、約10,000文字の意味不明な文字が返されます

編集 これは自己署名証明書の変更されたコードですが、暗号化されたストリームをまだ取得しています:

public String GetWebPageHTTPS(String URI){
    TrustManager[] trustAllCerts = new TrustManager[] { 
            new X509TrustManager() {     
                public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
                    return null;
                } 
                public void checkClientTrusted( 
                    java.security.cert.X509Certificate[] certs, String authType) {
                    } 
                public void checkServerTrusted( 
                    java.security.cert.X509Certificate[] certs, String authType) {
                }
            } 
        }; 
        try {
            SSLContext sc = SSLContext.getInstance("SSL"); 
            sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (GeneralSecurityException e) {
        } 
        try { 
            System.out.println("URI: " + URI);
            URL url = new URL(URI); 
        } catch (MalformedURLException e) {
        } 
    BufferedReader read;
    URL inputURI;
    String line;
    String renderedPage = "";
    try{
        inputURI = new URL(URI);
        HttpsURLConnection connect;
        connect = (HttpsURLConnection)inputURI.openConnection();
        read = new BufferedReader (new InputStreamReader(connect.getInputStream()));
        while ((line = read.readLine()) != null)
            renderedPage += line;
        read.close();
    }
    catch (MalformedURLException e){
        e.printStackTrace();
    }
    catch (IOException e){
        e.printStackTrace();
    }
    return renderedPage;
}
4

2 に答える 2

1

「ひょっとして圧縮されているのですか?stackoverflow.com/questions/8249522/…」 – Mahesh Guruswamy

はい、これは gzip で圧縮されているだけであることがわかりました。

public String GetWebPageGzipHTTP(String URI){ 
    String html = "";
    try {
        URLConnection connect = new URL(URI).openConnection();                        
        BufferedReader in = null;
        connect.setReadTimeout(10000);
        connect.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401");
        if (connect.getHeaderField("Content-Encoding")!=null && connect.getHeaderField("Content-Encoding").equals("gzip")){
            in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connect.getInputStream())));            
        } else {
            in = new BufferedReader(new InputStreamReader(connect.getInputStream()));            
        }          
        String inputLine;
        while ((inputLine = in.readLine()) != null){
        html+=inputLine;
        }
    in.close();
        return html;
    } catch (Exception e) {
        return html;
    }
}

}

于 2013-05-26T19:00:34.647 に答える
0

HTTPS は常に証明書を提示し、その後の通信は安全な暗号化チャネルで行われます。それが、あなたが受け取っているものが意味不明に見える理由です。

署名された証明書の場合、HttpsURLConnection が作業を行い、すべてが機能します。証明書が認証局によって署名されていない場合、事態は混乱します。このような場合、ブラウザからその URL を開くと、続行する前に確認して受け入れるための証明書が表示されます。

ここで同様の問題があるようです。あなたがする必要があるのは、文句を言わずに自己署名証明書を受け入れるように Java に指示することです。ここには 2 つのオプションがあります。証明書をダウンロードして (任意のブラウザーで URL を開くと、方法が表示されます)、それを JVM のキーストアに追加するか、独自の TrustManager を作成して証明書の検証を無効にします。

これら両方のオプションの詳細については、この SO 回答を参照してください。https://stackoverflow.com/a/2893932/2385178

于 2013-05-17T15:02:41.987 に答える