2017-02-01 28 views
0

私のアプリケーションはwebsphere上で動作するWebサービスプロバイダであり、SOAP Webサービスクライアントは各クライアント固有のいくつかのキーストアで構成されています。私は別のcertsを使用して、受信クライアント要求に基づいてバックエンドサーバーとのTLS接続を確立する必要があるので、アプリケーションをtomcatに移行する必要があります。動的SSLキーストア/証明書の選択

私はspringbootを使用しています。キーストアとトラストア。私はクライアントに基づいて、実行時に証明書/キーストアを設定したい

http://zoltanaltfatter.com/2016/04/30/soap-over-https-with-client-certificate-authentication/

:下のリンクをたどっ。これを行うために、Keystoresと構成(クライアント)名を配線しているので、クライアント固有のキーストアを動的に使用できます。しかし、これは緊密に結合されたものです。新しいクライアントがあるたびに、クライアントのエントリを作成し、対応するキーストアを設定する必要があります。

私は、すべての証明書を1つのキーストアに保存し、クライアント固有の証明書にどのように動的にアクセスできるのかを考えています。

答えて

0

エイリアスによって識別されるすべてのクライアント証明書をキーストアを使用して管理できます。

デフォルトのKeyManagerは、ハンドシェイクの最初の証明書を選択するため、接続を作成する前に独自のX509KeyManagerを作成して、使用するエイリアスを指定する必要はありません。 How I can tell alias of the wanted key-entry to SSLSocket before connecting?

KeyStore keystore = ... //The keystore with all your certificates 

//The keymanager for an specific connection 
KeyManagerFactory kmf= KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmf.init(keystore, password.toCharArray()); 

//Create a keyManager wrapper that returns the alias to use 
final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0]; 
X509KeyManager km = new X509KeyManager() { 
    public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { 
     return "alias"; 
    } 

    public X509Certificate[] getCertificateChain(String alias) { 
     return origKm.getCertificateChain(alias); 
    } 

// override the rest of the methods delegating to origKm ... 
} 

HttpsUrlConnectionMessageSenderで新しいkeyManager

HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender(); 
//messageSender.setKeyManagers(keyManagerFactory.getKeyManagers()); 
messageSender.setKeyManagers(new KeyManager[] { km }); 
+0

を注入参照してください。私はそれが働いて、あなたのアプローチを試してみましたが、私は別の問題に直面しました。私はX509Keymanagerを宣言し、上記の2つのメソッドをオーバーライドしましたが、宛先サーバを呼び出したときに、以下のエラーメッセージが表示されました: 'RECV TLSv1.2警告:fatal、unexpected_message メイン処理例外:javax.net.ssl .SSLException:致命的な受信 'X509KeyManagerの代わりにHttpsUrlConnectionMessageSenderにKeyManagerオブジェクトを提供することで、このエラーを修正しました。サーバーのSSLトレースは、サーバーがクライアントから_CERTIFICATE-VERIFYメッセージ_を取得していないことを示しているため、接続は突然終了します。 – user3709612

+0

正確なエラーは次のとおりです。 '原因:org.springframework.ws.client.WebServiceIOException:I/Oエラー:致命的警告を受信しました:unexpected_message;入れ子にされた例外はjavax.net.ssl.SSLExceptionです:致命的警告を受け取りました:unexpected_message \t at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:561)〜[spring-ws-core-2.3.1 .RELEASE.jar:2.3.1.RELEASE] .....原因:javax.net.ssl.SSLException:致命的アラートを受信しました:unexpected_message \t at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) )〜[na:1.8.0_71] ' – user3709612

+0

私はこの問題を解決しました。私のメソッドは、メソッドをオーバーライドしなかったので、秘密鍵をヌルとしてフェッチするように見えます。これは修正され '@Override \t \t \t公共のPrivateKey getPrivateKey(文字列arg0に){ \t \t \t \tが// TODO自動生成方法スタブ \t \t \t \t戻りorigKm.getPrivateKey(arg0に)。 \t \t \t} – user3709612