SKi*_*SKi 10 java authentication ssl keystore
我在java密钥库中有两个证书/密钥对.这些关键词的别名是"foo"和"bar".
我的TLS客户端(java程序)使用密钥库.在连接打开期间完成TLS客户端身份验证.当TLS服务器从客户端请求证书时,客户端程序应使用"foo"键入.现在,客户端在连接握手期间向服务器发送错误的证书("bar").
如何在连接之前告诉SSLSocket所需的密钥条目的别名?
目前代码如下:
final SSLSocket ss = (SSLSocket)SSLSocketFactory.getDefault().createSocket();
ss.setEnabledProtocols( new String[] {"TLSv1"});
ss.connect( targetAddress );
Run Code Online (Sandbox Code Playgroud)
Bru*_*uno 17
默认情况下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...
}
Run Code Online (Sandbox Code Playgroud)
然后用它来SSLContext:
SSLContext sslContext = sslContext.getInstance("TLS");
sslContext.init(new KeyManager[] { km }, null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6374 次 |
| 最近记录: |