HttpClient4.5.5中loadKeyMaterial方法弃用报错,求替代方案
解决HttpClient 4.5.5中
loadKeyMaterial()方法报错的问题 这个报错是因为从HttpClient 4.4版本开始,SSLContextBuilder.loadKeyMaterial(KeyStore, char[])这个重载方法被标记为弃用,在4.5+版本中已经不再支持直接这样调用。下面是两种可行的替代方案:
方案一:使用带PrivateKeyStrategy的loadKeyMaterial重载方法
这个方案允许你自定义选择密钥库中的密钥别名,适合密钥库包含多个证书的场景:
configureBody(request, requestData.getBody()) configureHeaders(request, requestData.getHeadersAsMap()) String keyPassphrase = "password"; KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream("Resources/certificates/selfsigned.jks"), keyPassphrase.toCharArray()); // 自定义密钥别名选择策略,如果只有一个别名直接返回第一个即可 SSLContext sslContext = SSLContexts.custom() .loadKeyMaterial(keyStore, keyPassphrase.toCharArray(), (aliases, socket) -> { return aliases.iterator().next(); }) .build(); HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build(); HttpResponse response = httpClient.execute(request, httpClientContext);
方案二:通过KeyManagerFactory加载密钥材料
如果不需要自定义别名策略,这个方法更简洁,是标准的密钥管理器初始化方式:
configureBody(request, requestData.getBody()) configureHeaders(request, requestData.getHeadersAsMap()) String keyPassphrase = "password"; KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream("Resources/certificates/selfsigned.jks"), keyPassphrase.toCharArray()); // 初始化密钥管理器工厂 KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, keyPassphrase.toCharArray()); // 从工厂获取密钥管理器并设置到SSLContext SSLContext sslContext = SSLContexts.custom() .setKeyManagers(kmf.getKeyManagers()) .build(); HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build(); HttpResponse response = httpClient.execute(request, httpClientContext);
注意事项
- 确保
Resources/certificates/selfsigned.jks的路径是正确的,避免出现文件找不到的异常 - 如果你的密钥库包含多个密钥别名,在方案一的
PrivateKeyStrategy中要明确指定你需要使用的别名,否则会默认选择第一个可用的别名 - 密钥库的密码要和初始化时传入的密码一致,否则会加载失败
内容的提问来源于stack exchange,提问作者Nitin Sharma
相关产品推荐
相关产品推荐

