- PR -

HttpClientでのクライアント認証について

1
投稿者投稿内容
MASA0306
会議室デビュー日: 2008/10/27
投稿数: 9
投稿日時: 2009-02-23 20:01
お世話になります。

HttpClientでのクライアント認証について質問です。
現在、以下の環境にてクライアント認証を試そうとしてるのですがエラーになってしまいます。。

■環境
java6
tomcat6
HttpClientは、apachecommonsのcommons-httpclient-3.1.jarを使用しています。

証明書の設定を下記のようにしています。
tomcat6のserver.xmlを変更。
コード:
    <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               acceptCount="100"
               useURIValidationHack="false" disableUploadTimeout="true"
               clientAuth="true" sslProtocol="TLS" keystorePass="changeit"
         keystoreFile="C:/tmp/test/.keystore" />




%JAVA_HOME%\\jre\\lib\\security\\cacertsにサーバ証明書をインポート済

クライアント側のソース

コード:
            PostMethod post = new PostMethod ("https://localhost/sample/Test");
            // 証明書情報設定
            System.setProperty("javax.net.ssl.keyStore", keyStore);
            System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
            System.setProperty("javax.net.ssl.keyStoreType", keyStoreType);
            System.setProperty("javax.net.ssl.trustStore", trustStore);
            System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
            int result = httpclient.executeMethod(post);




■エラー内容
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:1435)
at com.sun.net.ssl.internal.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:103)
at com.sun.net.ssl.internal.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:612)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.sendChangeCipherAndFinish(ClientHandshaker.java:808)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:734)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:197)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at java.io.FilterOutputStream.flush(FilterOutputStream.java:123)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:506)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at client.httpclientTest.main(httpclientTest.java:55)


クライアント証明書をサーバ側で受け取りたいのですが、接続時にエラーになってしまいます。
設定が間違っているのでしょうか。

よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2009-02-24 09:17
引用:

MASA0306さんの書き込み (2009-02-23 20:01) より:
java.net.SocketException: Software caused connection abort: recv failed


ブラウザやOpenSSLのs_clientで接続した場合はどうなりますか?
サーバ側のログに何か残っていませんか?
MASA0306
会議室デビュー日: 2008/10/27
投稿数: 9
投稿日時: 2009-02-24 10:27
https://localhostが表示出来ていませんでした。
これが原因でしょうか・・・

clientAuth="true"を"false"にすると表示出来るのですが、
clientAuth="true"にした場合の設定が違っているのでしょうか。
因みに、tomcat4ではうまく出来ていました。
MASA0306
会議室デビュー日: 2008/10/27
投稿数: 9
投稿日時: 2009-02-24 13:43
■結論
tomcatの設定が間違っていました。

server.xmlの設定
コード:
    <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               acceptCount="100"
               useURIValidationHack="false" disableUploadTimeout="true"
               clientAuth="true" sslProtocol="TLS" 
               keystorePass="changeit"
               keystoreFile="C:/tmp/test/.keystore" 
               truststoreFile="cacerts" 
               truststorePass="changeit"
               />



tomcat-users.xmlを追加で正常に動作しました。

1

スキルアップ/キャリアアップ(JOB@IT)