クライアント証明書を使用する 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つの中心点にあります。