Сертификат и ключ, используемые для сервера SSLContext
, выбираются с помощью KeyManager
, с которым они инициализируются.
Если вы хотите вручную выбрать сертификат и / или ключ, вы можете реализовать свой собственный KeyManager и поместить свой код в:
String chooseServerAlias(String keyType, Principal[] issuers, Socket socket)
PrivateKey getPrivateKey(String alias)
Первый метод позволяет указать, какой псевдоним идентифицируетсертификат, а второй получает псевдоним, определенный в первом методе, и загружает закрытый ключ.
Если первый метод реализован так, что он возвращает псевдоним ключа / сертификата в хранилище ключей, которое вы можете делегироватьвторой существующему экземпляру KeyManager.
Полученный код будет выглядеть следующим образом:
String algorithm = KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
keyManagerFactory.init(keyStore, "".toCharArray());
KeyManager[] defaultKeyManagers = keyManagerFactory.getKeyManagers();
KeyManager mykm = new MyKeyManager((X509KeyManager) defaultKeyManagers[0]);
sslContext.init(new KeyManager[] { mykm } , trustManagerFactory.getTrustManagers(), new SecureRandom());
static class MyKeyManager implements X509KeyManager {
final X509KeyManager delegate;
public KeyManager(X509KeyManager delegate) {
this.delegate = delegate;
}
public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
delegate.chooseClientAlias(keyType, issuers, socket);
}
public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
... implement your code here
}
public X509Certificate[] getCertificateChain(String alias) {
return delegate.getCertificateChain(alias);
}
public String[] getServerAliases(String keyType, Principal[] issuers) {
return delegate.getServerAliases(keyType, issuers);
}
public String[] getClientAliases(String keyType, Principal[] issuers) {
return delegate.getClientAliases(keyType, issuers);
}
public PrivateKey getPrivateKey(String alias) {
return delegate.getPrivateKey(alias);
}
}