【问题标题】:How to specify a certificate alias for a ResteasyClient/HttpClient keystore?如何为 ResteasyClient/HttpClient 密钥库指定证书别名?
【发布时间】:2018-07-24 20:31:21
【问题描述】:
我正在查看 ResteasyClientBuilder 的文档,其中可以为 2 路 SSL 握手/身份验证指定客户端密钥库。
有一种方法keystore() 可以指定密钥库(路径+密钥库密码)以及客户端证书的私钥。但是,如何指定要使用的密钥的别名?
鉴于 ResteasyClient 利用了 HttpClient,我在 Apache 的 SSLSocketFactory 构造函数中看到了同样的问题。
是否有在任一框架中指定别名?此客户端密钥库是否只需要一个证书对?我没有看到任何指定别名的选项。
【问题讨论】:
标签:
java
ssl
resteasy
apache-httpclient-4.x
【解决方案1】:
如果您可以使用 Apache HttpComponents,您可以通过将 PrivateKeyStrategy 提供给 SSLContextBuilder 来指定要使用的别名。
private SSLContext createContext(String keyStorePath, String keyStorePassword, String privateKeyAlias) {
final char[] password = keyStorePassword.toCharArray();
// This keyStore could also come from `file.toURI().toURL();`
final URL keyStore = Application.class.getClassLoader().getResource(keyStorePath);
return SSLContextBuilder.create()
.loadKeyMaterial(keyStore, password, password, (aliases, socket) -> privateKeyAlias)
.loadTrustMaterial(keyStore, password)
.build();
}
如果您需要使用上下文连接到多个端点,您可以更改函数(alias, socket) -> "aliasToUse" 以满足您的需求。