Аутентификация на основе клиентских сертификатов с помощью HttpComponents - PullRequest
0 голосов
/ 12 марта 2012

У меня проблема с проверкой подлинности на основе сертификатов с использованием http-компонентов apaches. Каждый раз, когда я запускаю запрос, я получаю код ответа 403. Если я включаю шифрование ssl и аутентификацию, соединение может быть успешно установлено.

Я предполагаю, что сертификаты в порядке, потому что они уже работали в другом контексте.

Следующий код показывает, как я запускаю запрос.

HttpClient httpClient = null;
try
{

    HttpParams httpParameters = new BasicHttpParams();

    KeyStore rootca = KeyStore.getInstance(KeyStore.getDefaultType());
    rootca.load(new FileInputStream("server.jks"), "bara".toCharArray());

    KeyStore mycert = KeyStore.getInstance("JKS");
    mycert.load(new FileInputStream("client.jks"), "bara".toCharArray());

    SSLSocketFactory sockfact = new SSLSocketFactory(mycert, "bara", rootca);
    sockfact.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", sockfact, 443));
    httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParameters, registry), httpParameters);

    HttpGet get = new HttpGet("https://mycomputer.mynetwork/test");
    HttpResponse response = httpClient.execute(get);

    System.out.println(response.getStatusLine());

}

Нет исключения или дальнейшего сообщения. Я отладил код, загрузив исходники. Даже тогда я не могу локализовать ошибку. Только следующее исключение брошено, но я не могу видеть причину. «Сброс соединения по пиру: ошибка записи в сокет»

Я был бы благодарен за каждую идею.

С уважением.

Обновление: после редактирования настроек ведения журнала я получаю следующее исключение:

reset by peer: socket write error>javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: java.net.SocketException: Connection reset by peer: socket write error
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1325)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1337)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:44)
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.flushBuffer(AbstractSessionOutputBuffer.java:131)
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.flush(AbstractSessionOutputBuffer.java:138)
    at org.apache.http.impl.conn.LoggingSessionOutputBuffer.flush(LoggingSessionOutputBuffer.java:95)
    at org.apache.http.impl.AbstractHttpClientConnection.doFlush(AbstractHttpClientConnection.java:271)
    at org.apache.http.impl.SocketHttpClientConnection.close(SocketHttpClientConnection.java:246)
    at org.apache.http.impl.conn.DefaultClientConnection.close(DefaultClientConnection.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.close(AbstractPooledConnAdapter.java:152)
    at org.apache.http.protocol.HttpRequestExecutor.closeConnection(HttpRequestExecutor.java:142)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:129)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:647)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at Client.main(Client.java:54)
Caused by: javax.net.ssl.SSLException: java.net.SocketException: Connection reset by peer: socket write error
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1692)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1656)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1601)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:93)
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.flushBuffer(AbstractSessionOutputBuffer.java:131)
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.flush(AbstractSessionOutputBuffer.java:138)
    at org.apache.http.impl.conn.LoggingSessionOutputBuffer.flush(LoggingSessionOutputBuffer.java:95)
    at org.apache.http.impl.AbstractHttpClientConnection.doFlush(AbstractHttpClientConnection.java:271)
    at org.apache.http.impl.AbstractHttpClientConnection.flush(AbstractHttpClientConnection.java:276)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.flush(AbstractClientConnAdapter.java:194)
    at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:258)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
    ... 6 more
Caused by: java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at com.sun.net.ssl.internal.ssl.OutputRecord.writeBuffer(OutputRecord.java:297)
    at com.sun.net.ssl.internal.ssl.OutputRecord.write(OutputRecord.java:286)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:748)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:736)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:88)
    ... 14 more

1 Ответ

0 голосов
/ 12 марта 2012

В контексте SSL / TLS закрытое сервером соединение означает, что что-то пошло не так на этапе установления соединения.Возможно, клиентский сертификат не был принят или доступные наборы шифров клиента и сервера были несовместимы.

Чтобы узнать, что происходит не так, вам нужно изучить сетевой трафик, например, с помощью Wireshark.Он позволяет вам просматривать каждый отправленный пакет.

Кроме того, я бы протестировал сертификаты с использованием OpenSSL в режиме s_client - просто чтобы убедиться, что это не является общей проблемой с вашим клиентским сертификатом.

...