私は、apache 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());
}
例外メッセージまたはそれ以上のメッセージはありません。ソースをダウンロードしてコードをデバッグしました。それでも私はエラーをローカライズできません。単に次の例外がスローされますが、私は理由を見ることができません。 "ピアによる接続リセット:ソケット書き込みエラー"
すべてのアイデアに感謝します。
大切にしてください。
更新:ログの環境設定を編集した後、私は次の例外を取得:SSL/TLSの文脈では
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
ご回答いただきありがとうございます。残念ながら、私はかなりopensslに新しいです。証明書を検証する方法の例を教えてください。 – user1168876
OpenSSLはJKSキーストアでは使用できません。したがって、サーバー/ルート証明書、クライアント証明書、およびクライアントキーをファイルに抽出する必要があります。その後、 'openssl s_client -connect mycomputer.mynetwork:443 -cert client.cer -certform DER -key client.key -CAfile root.cer'を実行することができます。 – Robert
これは、リターンコード" 0 "証明書は大丈夫です。 – user1168876