0

バージョン 4.2.5 を使用しています。org.apache.httpcomponentsからAutoRetryHttpClientを呼び出して、スキームがhttpsの URL から PDF ファイルをダウンロードします。コードは NetBeans 7.3 で記述され、JDK7 を使用します。

架空の pdf リソースが にあると仮定するとhttps://www.thedomain.with/my_resource.pdf、次のコードが得られます。

SchemeRegistry registry = new SchemeRegistry();
    try {
        final SSLSocketFactory sf = new SSLSocketFactory(new TrustStrategy() {
            @Override
            public boolean isTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                return true;
            }
        });

        registry.register(new Scheme("https", 3920, sf));            
    } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | UnrecoverableKeyException ex) {
        Logger.getLogger(HttpConnection.class.getName()).log(Level.SEVERE, null, ex);
    }        
    //Here I create the client.
    HttpClient client = new AutoRetryHttpClient(new DefaultHttpClient(new PoolingClientConnectionManager(registry)),
            new DefaultServiceUnavailableRetryStrategy(5, //num of max retries
               100//retry interval)); 

        HttpResponse httpResponse = null;
        try {
            HttpGet httpget = new HttpGet("https://www.thedomain.with/my_resource.pdf");
            //I set header and Mozilla User-Agent
            httpResponse = client.execute(httpget);
        } catch (IOException ex) {
        }
        ... //other lines of code to get and save the file, not really important since the code is never reached

次の例外を呼び出すとclient.execute、スローされます

org.apache.http.conn.HttpHostConnectException: Connection to https://www.thedomain.with refused

そのpdfリソースを取得するにはどうすればよいですか?

PS: ブラウザ経由でダウンロードできるので、そのファイルを取得する方法があります。

4

1 に答える 1

0

いくつかの問題があるようです:

  • HTTPS の非標準ポート番号である 3920 をデフォルト ポートとして使用するようにスキームを登録しました。サーバーが実際にそのポートで実行されている場合は、ブラウザで次の URL を使用してアクセスする必要がありますhttps://www.thedomain.with:3920/my_resource.pdf。ブラウザで使用する URL には 3920 ポートが含まれていないため、サーバーはデフォルト ポートの 443 で実行されるため、変更new Scheme("https", 3920, sf)を使用する必要がありますnew Scheme("https", 443, sf)
  • サーバーの証明書の CN がホスト名と一致しないため、SSLPeerUnverifiedException. これを機能させるには、SSLSocketFactory(TrustStrategy, HostnameVerifier)コンストラクターを使用して、このチェックを行わないベリファイアを渡す必要があります。Apache は、AllowAllHostnameVerifierこの目的のために を提供します。

注:実際には運用コードで no-op TrustStrategy と HostnameVerifier を使用しないでください。リモート サーバーの認証に関するすべてのセキュリティ チェックが実質的にオフになり、なりすまし攻撃を受けやすくなります。

于 2013-09-10T15:29:01.597 に答える