2017-02-24 11 views
0

複数のクライアント証明書を含むjavaキーストアファイルがあります。 Javaアプリケーションでこれらの証明書の1つだけを選択してサービスに接続したいとします。これを行う簡単な方法はありますか?これまでの解決策を見つけた唯一の方法は、元のキーストアファイルからクライアント証明書の詳細(別名で見つかった)を使用してプログラムで新しいKeyStoreを作成することです。私は使用する証明書のためだけに新しいキーストアを作成するのではなく、「keystore.jksファイルからこのエイリアスを使って証明書を使用する」という簡単な方法があるかもしれません。次のようにコードがある:Javaキーストア - キーストアファイルから使用する証明書をプログラムで選択

 // Set up Client Cert settings 
     KeyStore clientCertStore = KeyStore.getInstance("JKS"); 
     clientCertStore.load(new FileInputStream(clientKeystoreLocation), clientKeystorePassword);    

     // Create temporary one keystore, then extract the client cert using it's alias from keystore.jks, then create 
     // a new keystore with this cert, that the process will use to connect with. 
     KeyStore tempKstore = KeyStore.getInstance("JKS"); 
     tempKstore.load(null); 
     tempKstore.setKeyEntry(certificateAlias, clientCertStore.getKey(certificateAlias, bwConfig.clientKeystorePassword), 
       clientKeystorePassword, clientCertStore.getCertificateChain(certificateAlias)); 
     clientCertStore = tempKstore; 

     KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyManagerFactory.init(clientCertStore, clientKeystorePassword);    

     // Set up Truststore settings 
     File truststoreFile = new File(TrustStoreLocation); 
     KeyStore trustStore = KeyStore.getInstance("JKS"); 
     trustStore.load(new FileInputStream(truststoreFile), TrustStorePassword); 
     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     trustManagerFactory.init(trustStore); 

     // Set to TLS 1.2 encryption 
     SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); 
     sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 

     SSLSocketFactory ssf = sslContext.getSocketFactory(); 
     ssf.createSocket(serviceURL.getHost(), servicePort); 

     bp.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", ssf); 

答えて

0

あなたの質問は、デフォルトKeyManagerHow I can tell alias of the wanted key-entry to SSLSocket before connecting?

に似ています(サーバから送信されたCAリストに従って)ハンドシェイクで最初の証明書を選択します、あなたは指定するX509KeyManagerあなた自身を構築することができます使用されるエイリアスはデフォルトをラップします。 SSLContext

sslContext.init(new KeyManager[] { km }, trustManagerFactory.getTrustManagers(), null); 
で新しい keyManagerを設定

final X509KeyManager origKm = (X509KeyManager)keyManagerFactory.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 ... 
} 

関連する問題