默认KeyManager
将发送它找到的与服务器请求的条件匹配的第一个证书,也就是说,它将发送它找到的第一个证书,它可以在请求期间服务器发送的 CA 名称中建立一个证书链.
如果您总是希望选择特定的别名,则需要实现自己的X509KeyManager
,可能包装默认管理器。这些方面的东西应该可以工作(没有测试这个实际的代码,可能有一些错别字):
KeyStore keystore = ... // create and load your keystore.
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keystore, password.toCharArray());
final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
X509KeyManager km = new X509KeyManager() {
public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
return "foo";
}
public X509Certificate[] getCertificateChain(String alias) {
return origKm.getCertificateChain(alias);
}
// Delegate the rest of the methods from origKm too...
}
然后将其用于您的SSLContext
:
SSLContext sslContext = sslContext.getInstance("TLS");
sslContext.init(new KeyManager[] { km }, null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();