2012-03-12 3 views
0

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

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

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

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()); 

} 

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

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

С уважением.

Update: после редактирования каротажных предпочтений я получаю следующее исключение:

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 

ответ

0

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

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

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

+0

благодарит за ваш ответ. К сожалению, я довольно новичок в opensl. Не могли бы вы привести пример, как я могу проверить мои сертификаты? – user1168876

+0

OpenSSL не может работать с хранилищами JKS, поэтому вам необходимо извлечь сертификат сервера/корня, сертификат клиента и ключ клиента в файл. Впоследствии вы можете выполнить 'openssl s_client -connect mycomputer.mynetwork: 443 -cert client.cer -certform DER -key client.key -CAfile root.cer' – Robert

+0

Хорошо, я попробовал это .. он говорит код возврата« 0 », так что сертификаты должны быть в порядке – user1168876

Смежные вопросы