Ssl KeyStore和KeyManager/TrustManager之间的区别

Ssl KeyStore和KeyManager/TrustManager之间的区别,ssl,httpclient,keystore,truststore,Ssl,Httpclient,Keystore,Truststore,为密钥库和信任库使用密钥库对象的区别是什么;与使用KeyManager和TrustManager相反 让我解释一下我为什么这么问。我正在使用RESTEasy,需要使用SSL证书通过HTTPS进行REST调用。我需要增加RESTEasy创建ClientRequest的方式。以下是我最初的想法: public void afterPropertieSet()引发异常{ Assert.isTrue(StringUtils.isNotBlank(getKeystoreName()),“密钥存储名称为空”

为密钥库和信任库使用密钥库对象的区别是什么;与使用KeyManager和TrustManager相反

让我解释一下我为什么这么问。我正在使用RESTEasy,需要使用SSL证书通过HTTPS进行REST调用。我需要增加RESTEasy创建ClientRequest的方式。以下是我最初的想法:

public void afterPropertieSet()引发异常{
Assert.isTrue(StringUtils.isNotBlank(getKeystoreName()),“密钥存储名称为空”);
Assert.isTrue(StringUtils.isNotBlank(getkeystrepassword()),“密钥存储密码为空。”);
isTrue(StringUtils.isNotBlank(getKeyRepath()),“密钥存储路径为空”);
Assert.isTrue(StringUtils.isNotBlank(getTruststoreName()),“信任存储名称为空”);
Assert.isTrue(StringUtils.isNotBlank(getTruststorePassword()),“信任存储区密码为空。”);
Assert.isTrue(StringUtils.isNotBlank(getTruststorePath()),“信任存储路径为空”);
//为相互身份验证设置密钥库和信任库
createKeystore();
createTruststore();
if(getHttpClient()==null){
//初始化HTTP客户端
初始化HttpClient();
}
Assert.notNull(getHttpClient(),“HTTP客户端初始化后为NULL”);
}
公共ClientRequest createClientRequest(字符串uri)抛出uri语法异常{
ClientExecutor ClientExecutor=新的ApacheHttpClient4Executor(getHttpClient());
ClientRequestFactory fac=新的ClientRequestFactory(clientExecutor,新URI(URI));
返回fac.createRequest(uri);
}
private void createTruststore()引发KeyStoreException、FileNotFoundException、IOException、,
NoSuchAlgorithmException,CertificateException{
字符串truststoreFilePath=getTruststorePath()+getTruststoreName();
KeyStore truststore=KeyStore.getInstance(KeyStore.getDefaultType());
InputStream truststoreInput=getClass().getClassLoader().getResourceAsStream(truststoreFilePath);
load(truststoreInput,getTruststorePassword().toCharArray());
}
private void createKeystore()抛出KeyStoreException、FileNotFoundException、IOException、,
NoSuchAlgorithmException,CertificateException{
字符串keystoreFilePath=getKeystorePath()+getKeystoreName();
KeyStore KeyStore=KeyStore.getInstance(KeyStore.getDefaultType());
InputStream keystoreInput=getClass().getClassLoader().getResourceAsStream(keystoreFilePath);
load(keystoreInput,getKeystorePassword().toCharArray());
}
/**
*初始化HTTP客户端
* 
*@KeyStoreException
*@NoSuchAlgorithmException
*@抛出不可恢复的KeyException
*@KeyManagementException
*/
private void initializeHttpClient()引发KeyManagementException、UnrecoverableKeyException、,
NoSuchAlgorithmException,KeyStoreException{
//向scheme注册表注册https和http
SchemeRegistry SchemeRegistry=新SchemeRegistry();
SSLSocketFactory SSLSocketFactory=新的SSLSocketFactory(getKeystore()、getkeystrepassword()、getruststore());
register(新方案(HTTP,80,PlainSocketFactory.getSocketFactory());
register(新方案(HTTPS,443,sslSocketFactory));
//设置连接参数
HttpConnectionParams.setConnectionTimeout(httpParameters,serviceConnectionTimeout);
HttpConnectionParams.setSoTimeout(httpParameters,readTimeout);
HttpConnectionParams.SetStaleCheckEnabled(httpParameters,true);
//创建连接管理器
PoolgClientConnectionManager客户端管理器=新的PoolgClientConnectionManager(schemeRegistry);
setMaxTotal(maxTotalConnections);
setDefaultMaxPerRoute(defaultMaxConnectionsPerHost);
httpClient=新的默认httpClient(clientManager,httpParameters);
}
我遇到了对等证书的问题,并不断得到一个异常:

javax.net.ssl.SSLPeerUnverifiedException:对等方未经过身份验证

然后我四处搜索,找到了关于设置HttpClient但使用TrustManager和KeyManager的文章/博客。我重构代码以执行以下操作:

public void afterPropertieSet()引发异常{
Assert.isTrue(StringUtils.isNotBlank(getKeystoreName()),“密钥存储名称为空”);
Assert.isTrue(StringUtils.isNotBlank(getkeystrepassword()),“密钥存储密码为空。”);
isTrue(StringUtils.isNotBlank(getKeyRepath()),“密钥存储路径为空”);
Assert.isTrue(StringUtils.isNotBlank(getTruststoreName()),“信任存储名称为空”);
Assert.isTrue(StringUtils.isNotBlank(getTruststorePassword()),“信任存储区密码为空。”);
Assert.isTrue(StringUtils.isNotBlank(getTruststorePath()),“信任存储路径为空”);
if(getHttpClient()==null){
//初始化HTTP客户端
初始化HttpClient();
}
Assert.notNull(getHttpClient(),“HTTP客户端初始化后为NULL”);
}
公共ClientRequest createClientRequest(字符串uri)抛出uri语法异常{
ClientExecutor ClientExecutor=新的ApacheHttpClient4Executor(getHttpClient());
ClientRequestFactory fac=新的ClientRequestFactory(clientExecutor,新URI(URI));
返回fac.createRequest(uri);
}
/**
*初始化HTTP客户端
* 
*@KeyStoreException
*@NoSuchAlgorithmException
*@抛出不可恢复的KeyException
*@KeyManagementException
*/
private void initializeHttpClient()引发异常{
如果(isCheckPeerCertificates()){
checkPeerCerts();
}
//创建信任和关键管理者
//使用TrustManager和KeyManager而不是密钥库
TrustManager[]TrustManager=GetTrustManager(getTruststorePassword());
KeyManager[]keyManagers=getKeyManagers(getkeystrepassword());
//创建SSL上下文
SSLContext ctx=SSLContext.getInstance(“TLS”);
ctx.init(密钥管理器、信任管理器)