Java キーストアを使用して WebServiceTemplate を構成することは可能ですか?
編集
春の設定でキーストアの場所を設定する方法を探しています
私は 6 年後にこの回答を投稿していますが、正直なところ、完全で簡潔な解決策が提供されている投稿は 1 つもありません。必要なのは、spring-ws-core (2.1.4.RELEASE +) と spring-we-security (2.2.4.RELEASE +) の依存関係だけです。次のステップは、カスタム キーストアとトラストストアを Bean として構成し、それらを Spring 構成の Web サービス テンプレートに挿入することです。
<bean id="myKeyStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
<property name="location" value="file:/tmp/config/my-keystore.jks"/>
<property name="password" value="password"/>
</bean>
<bean id="myTrustStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
<property name="location" value="file:/tmp/config/my-truststore.jks"/>
<property name="password" value="different_password"/>
</bean>
<bean id="template" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender">
<property name="trustManagers">
<bean class="org.springframework.ws.soap.security.support.TrustManagersFactoryBean">
<property name="keyStore" ref="mytrustStore" />
</bean>
</property>
<property name="keyManagers">
<bean class="org.springframework.ws.soap.security.support.KeyManagersFactoryBean">
<property name="keyStore" ref="myKeyStore" />
<property name="password" value="password" />
</bean>
</property>
</bean>
</property>
</bean>
Summery では、コードを記述する必要はありません。ユース ケースは、Spring 構成を使用して簡単に実現できます。
この投稿で見つけた答えと質問は、しばらくの間、尻尾を追いかけ続けました. 最後に、WebLogic サーバーのキーストアにキーストアをインポートすることで、WebLogic 11g にデプロイしたアプリケーションでこれを機能させることができました。
C:\bea\jrockit_160_14_R27.6.5-32\jre\bin>keytool -importkeystore -srckeystore \workspace\myProject\webservice.keystore
次に、このキーストアを指すように WebLogic キーストアの構成を変更しました。これは、WL コンソール ( Environment->Servers->AdminServer->Keystores )から実行できます。Keystores: 選択を"Custom Identity and Custom Trust"に変更し、 Identity (incoming) およびTrust (outgoing) セクションにキーストアの場所へのパスを入力します。Windows XP では、私のファイルは \Documents an Settings\my id\.keystore にありました。
私はパスフレーズを提供しませんでした。それはオプションだと思います。
JSSE が使用するキーストアを構成したいということだと思います。これはテンプレートが使用するためです。JSSE は常に javax.net.ssl.keyStore/javax.net.ssl.keyStorePassword システム プロパティを調べて、キーストアを見つけます。このような InitializingBean を使用して、Spring でこれらのプロパティを構成できます。
アプリサーバーで実行している場合、Spring が初期化される前に JSSE がすでに構成されている可能性があることに注意してください。この場合、アプリ サーバー インターフェイスを使用してキーストアを設定する必要があります。通常は、コマンド ラインで -D params を使用します。
<bean id="jsseInitializer" lazy-init="false" class="com.blah.JsseInitializer">
<property name="trustStoreLocation" value="${pnet.batch.trustStore.location}"/>
<property name="trustStorePassword" value="${pnet.batch.trustStore.password}"/>
<property name="keyStoreLocation" value="${pnet.batch.keyStore.location}"/>
<property name="keyStorePassword" value="${pnet.batch.keyStore.password}"/>
</bean>
public class JsseInitializer implements InitializingBean {
private String trustStoreLocation;
private String trustStorePassword;
private String keyStoreLocation;
private String keyStorePassword;
public String getTrustStoreLocation() {
return trustStoreLocation;
}
public void setTrustStoreLocation(String trustStoreLocation) {
this.trustStoreLocation = trustStoreLocation;
}
public String getTrustStorePassword() {
return trustStorePassword;
}
public void setTrustStorePassword(String trustStorePassword) {
this.trustStorePassword = trustStorePassword;
}
public String getKeyStoreLocation() {
return keyStoreLocation;
}
public void setKeyStoreLocation(String keyStoreLocation) {
this.keyStoreLocation = keyStoreLocation;
}
public String getKeyStorePassword() {
return keyStorePassword;
}
public void setKeyStorePassword(String keyStorePassword) {
this.keyStorePassword = keyStorePassword;
}
public void afterPropertiesSet() throws Exception {
System.setProperty("javax.net.ssl.trustStore", trustStoreLocation);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
System.setProperty("javax.net.ssl.keyStore", keyStoreLocation);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
}
}
このスレッドへの返信が遅くなりましたが、いずれにせよ: キーストアと他のすべてを設定したら、WebServiceTemplate が HTTPS 接続をサポートしていないように見えることにショックを受けるかもしれません!
messageSender
プロパティが に設定されていることを確認してくださいorg.springframework.ws.transport.http.CommonsHttpMessageSender
。デフォルトのWebServiceMessageSender
実装は HTTPS をサポートしていません。
KeyStore.Builder を使用して、キーストアをプログラムでロードできると思います。
したがって、Webサービステンプレートを持つかそれを拡張するクラスを作成し、Spring構成でキーストアのファイルパスを設定し、それを初期化Bean(Spring 3の@PostConstruct?)にしてからキーストアをロードします。
File f = new File(keyStorePath);
KeyStore.Builder builder = KeyStore.Builder.newInstance("type",provider,file,protection);
KeyStore keystore = builder.getKeyStore();
わかりました-実際にwebservicetemplateで使用するには、ここに記載されているように、キーストアコールバックに基づいている必要があると思います: http://static.springsource.org/spring-ws/sites/1.5/reference/html/security.html#d0e4462
または、キーストアマネージャーを設定できるスプリング org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender を使用することもできます。次に、それを webservicetemplate で使用できます。
このようなビット:
<bean id="template" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender">
<property name=""></property>
</bean>
</property>
</bean>
HTH
keytool コマンドを使用して、アプリ サーバーの実行に使用する JDK のキーストア (おそらく cacerts ファイル) に必要な証明書をインストールする必要があります。
コマンドの例を次に示します。
keytool -import -trustcacerts -alias someAlias -file someCert.crt -keystore yourKeystore
編集: 更新された質問に基づいて、これはあなたが探しているもののように見えます: http://static.springsource.org/spring-ws/sites/1.5/reference/html/security.html
スプリングブーツ用
Zoltan のこのブログはとても役に立ちました。
https://zoltanaltfatter.com/2016/04/30/soap-over-https-with-client-certificate-authentication/
彼のブログのコード スニペットを以下に示します。
必要なすべてのプロパティを application.properties に追加します。
@Value("${key-store}")
private Resource keyStore;
@Value("${key-store-password}")
private String keyStorePassword;
@Value("${trust-store}")
private Resource trustStore;
@Value("${trust-store-password}")
private String trustStorePassword;
また、WebServiceGatewaySupport を実装しているクラスの Uri、マーシャラー、アンマーシャラーを設定するとともに、メッセージ送信者を設定します。以下の手順に従う必要があります。
キーストアを使用してキーストア マネージャー ファクトリをロードする
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(keyStore.getInputStream(), keyStorePassword.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(ks, keyStorePassword.toCharArray());
トラストストアを使用してトラスト ストア マネージャー ファクトリをロードする
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(ts);
HttsUrlConnectionMessageSender のインスタンスを作成し、上で作成したキー マネージャー ファクトリとトラスト マネージャー ファクトリを使用して、キーとトラスト マネージャーを設定します。
HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
messageSender.setKeyManagers(keyManagerFactory.getKeyManagers());
messageSender.setTrustManagers(trustManagerFactory.getTrustManagers());
最後にメッセージ送信者を設定します
client.setMessageSender(messageSender);
ここで client は WebServiceGatewaySupport を拡張するクラスです