4

リクエスト後にApacheHttpClientを使用して認証済みサーバーのSSL証明書を取得する方法はありますか?サーバー側のrequest.getAttribute( "javax.servlet.request.X509Certificate")に対応するものだけですか?

4

2 に答える 2

4

これはいくつかの点で少しメタです。うまくいけば、どの接続マネージャーでも機能する方法でこれを実行しています。最新のHttpClient(4.2)で実行していることを前提としています

したがって、あなたがしなければならないことは、クライアントにHttpResponseInterceptorを追加することです。

((AbstractHttpClient)client).addResponseInterceptor(new HttpResponseInterceptor() {
    @Override
    public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
        HttpRoutedConnection routedConnection= (HttpRoutedConnection)context.getAttribute(ExecutionContext.HTTP_CONNECTION);
        if( routedConnection.isSecure() ) {
            Certificate[] certificates= routedConnection.getSSLSession().getPeerCertificates();
            // Assume that PEER_CERTIFICATES is a constant you've defined
            context.setAttribute(PEER_CERTIFICATES, certificates);
        }
    }
});

それが完了すると、このクライアントを介して行われたすべての要求は、接続が「セキュア」としてマークされているかどうかを確認してから、ピア証明書の取得を試みます。

この例では、ピア接続に関連付けられた証明書の配列全体を入力しているだけです。

この時点で、実行するには、次のようなことを行います。

HttpContext context= new BasicHttpContext();
HttpGet get= new HttpGet(....);
client.execute(get, context);
// should contain the array of Certificate - these are more likely X509Certificate instances
Certificate[] peerCertificates= (Certificate[])context.getAttribute(PEER_CERTIFICATES);certificates
// do whatever logic to complete and consume the request

うまくいけば、それはあなたが必要とするものを手に入れるでしょう-誰かがこれを超えた提案を持っているなら、彼らは感謝されるでしょう。

編集これはHttpRequestInterceptorとしても実行でき、接続がすでに確立されているのと同じ効果があります。

于 2012-11-07T16:49:01.623 に答える
2

HttpClient 4.5の場合、ソリューションを次のように変更する必要があります。

clientBuilder.addInterceptorLast(new HttpResponseInterceptor() {
        @Override
        public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
            ManagedHttpClientConnection routedConnection = (ManagedHttpClientConnection) context.getAttribute(HttpCoreContext.HTTP_CONNECTION);
            SSLSession sslSession = routedConnection.getSSLSession();
            if (sslSession != null) {
                Certificate[] certificates = sslSession.getPeerCertificates();
                // Assume that PEER_CERTIFICATES is a constant you've defined
                context.setAttribute(PEER_CERTIFICATES, certificates);
            }
        }
    });
于 2016-03-02T14:43:17.807 に答える