2

Apache http クライアントに基づく http クライアントを使用していますが、ssl 証明書に問題はないようです。カスタムSSLSocketFactoryを使用して、グローバルに認識された証明書と自己署名証明書の両方の単体テストがあります。

ただし、プロキシの背後で同じコードを実行すると、機能しなくなりました。私はこの恐ろしい例外を取得し続けます:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)

コードを最小限に減らしましたが、それでも同じ例外がスローされます。コード:

    URI uri = new URI("https://www.google.com");
    DefaultHttpClient client = new DefaultHttpClient();
    client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, 
            new HttpHost("proxy.int", 8080, "https"));

    HttpUriRequest request = new HttpGet(uri);
    HttpResponse response = client.execute(request);

何も指定されていない場合、デフォルトのssl設定を使用するかどうかわからなかったので、明示的に追加しました:

    URI uri = new URI("https://www.google.com");
    DefaultHttpClient client = new DefaultHttpClient();
    client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, 
            new HttpHost("proxy.int", 8080, "https"));

    client.getConnectionManager().getSchemeRegistry().register(
            new Scheme("https", 443, SSLSocketFactory.getSystemSocketFactory()));

    HttpUriRequest request = new HttpGet(uri);
    HttpResponse response = client.execute(request);

getSocketFactory() も試しました (getSystemSocketFactory() との違いは完全にはわかりません) が、それでも同じエラーが発生します。

編集

プロキシにはオプションの認証があり、私はありとなしの両方を試しました。認証情報は、次のコードを使用して設定されました。

    client.getCredentialsProvider().setCredentials(
        new AuthScope("proxy.int", 8080),
        new UsernamePasswordCredentials("user", "password")
    );

まったく同じエラーです。

4

1 に答える 1

7

問題はプロキシ宣言にあり、「https」ではなく「http」を指定する必要がありました。

client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, 
        new HttpHost("proxy.int", 8080, "http"));
于 2012-09-25T05:38:58.473 に答える