2

クライアント証明書を使用する Web サービスを呼び出す必要があります。このプログラムは、それぞれ独自の証明書を持つさまざまなクライアントによって使用されます。クライアント証明書は認証に使用されるため、クライアントは自分のデータだけを見ることができます。したがって、この Web サービスへのすべての呼び出しは、特定のキーストアを使用する必要があります。

Axis2 は、クライアント側のコードを生成するために使用されます。SocketFactory をスタブの特定のインスタンスに設定するこのコードを見つけました。

int x = 9443;
Protocol authProtocol;
authProtocol = 
      new Protocol("https",
                   setPrivateKey(keyStoreFileName,keyStoreType, keyStorePassword),
                   x
                  );
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, authProtocol);

そして、SocketFactory は次のようになります。

private static SSLSocketFactory setPrivateKey
  (String keyStoreFileName,
   String keyStoreType,
   String keyStorePassword
  ) 
  throws FileNotFoundException, 
         KeyStoreException, 
         IOException, 
         NoSuchAlgorithmException, 
         CertificateException, 
         UnrecoverableKeyException, 
         KeyManagementException
  {
    // Load the key store: change store type if needed
    KeyStore ks = KeyStore.getInstance(keyStoreType);
    FileInputStream fis = new FileInputStream(keyStoreFileName);
    try {
        ks.load(fis, keyStorePassword.toCharArray());
    } finally {
        if (fis != null) { fis.close(); }
    }
    // Get the default Key Manager
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(
       KeyManagerFactory.getDefaultAlgorithm());   
    kmf.init(ks, keyStorePassword.toCharArray());
     X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(new KeyManager[] {origKm }, null, null);

    return sslContext.getSocketFactory();
}

以下のインポートで

import com.sun.net.ssl.KeyManager;
import com.sun.net.ssl.SSLContext;
import com.sun.net.ssl.X509KeyManager;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.SocketFactory;
import javax.net.ssl.KeyManagerFactory;

import javax.net.ssl.SSLSocketFactory;

import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.xmlbeans.XmlException;

X509KeyManager と SSLContext は非推奨であるというメッセージが表示されます。このリンクのコード (このトピックに関する公式の AXIS2 ドキュメントから見つけたもの) でさえ、この非推奨のコードを使用しています。次に、このコードは SSLSocketFactory を使用しますが、プロトコルは ProtocolSocketFactory を想定しています。

X509KeyManager と SSLContext の代替品は何ですか? また、キーストアから ProtocolSocketFactory に到達する方法は? または、より良い方法があります。

AXIS2 1.6.2 Java 5 ツール jdeveloper 10.1.3 を使用

edit 22-01-2013 呼び出されている Web サービスは別の組織に属しており、Web サービスのサーバー側を制御できません。

「異なるクライアントによって使用される」とは、当社のソフトウェアの異なるユーザーです。それは1つの中心点にあります。

4

2 に答える 2

0

「異なるクライアントによって使用される」とは、異なる展開を意味すると思います。この場合、プログラムで正しいキーストアを選択することが本当に必要なのでしょうか? 複数の異なるキーストア (それぞれが 1 つのクライアントに対して) を使用して、アプリケーション サーバー/サーブレット コンテナーにクライアント証明書を処理させることは可能でしょうか? たとえば、Apache Tomcatの場合CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.keystore=<the keystore filename>"、サーバーを起動する前に設定を行うことができます。次に、承認なしで単純な http Web サービス用に通常どおりクライアント WS を作成します。Tomcat は、完全に透過的な方法で証明書を使用して、クライアント認証で SSL 接続を処理します。

于 2013-01-21T22:52:49.327 に答える