Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SSLContextBuilder无法加载KeyMaterial_Java_Apache Httpclient 4.x_Sslcontext - Fatal编程技术网

Java SSLContextBuilder无法加载KeyMaterial

Java SSLContextBuilder无法加载KeyMaterial,java,apache-httpclient-4.x,sslcontext,Java,Apache Httpclient 4.x,Sslcontext,我正在尝试使用ApacheHttpClient-4.5.5(带有httpcore-4.4.9)从应用“相互SSL”的服务器获取服务器证书。我正在创建一个SSLContext,如下所示: final String keystorePass = Configuration.getInstance().getItem(EmittentProperties.keystorePass); final String kmopEncKeyPass = Configuration.get

我正在尝试使用ApacheHttpClient-4.5.5(带有httpcore-4.4.9)从应用“相互SSL”的服务器获取服务器证书。我正在创建一个SSLContext,如下所示:

        final String keystorePass = Configuration.getInstance().getItem(EmittentProperties.keystorePass);
    final String kmopEncKeyPass = Configuration.getInstance().getItem(EmittentProperties.kmopEncKeyPass);
    final String kmopEncKeyAlias = Configuration.getInstance().getItem(EmittentProperties.kmopEncKeyAlias);

        //1.Create the SSLContext and SSLConnectionSocketFactory
    SSLContext sslContext;
    try {
        sslContext = SSLContexts.custom()
            .loadKeyMaterial(keystoreFile.getFile(), keystorePass.toCharArray(), kmopEncKeyPass.toCharArray(), new PrivateKeyStrategy() {
                @Override
                public String chooseAlias(Map<String, PrivateKeyDetails> aliases, Socket socket) {
                    return kmopEncKeyAlias;
                }})
            .loadTrustMaterial(new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }})
            .build();
    } catch (Exception e) {
        logger.error("Error initializing SSLContext: " + e.getMessage(), e);
        throw new FatalException(e.getMessage(), e);
    }
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
最终字符串keystrepass=Configuration.getInstance().getItem(EmittentProperties.keystrepass);
最后一个字符串kmopEncKeyPass=Configuration.getInstance().getItem(EmittentProperties.kmopEncKeyPass);
最后一个字符串kmopEncKeyAlias=Configuration.getInstance().getItem(EmittentProperties.kmopEncKeyAlias);
//1.创建SSLContext和SSLConnectionSocketFactory
SSLContext SSLContext;
试一试{
sslContext=SSLContexts.custom()
.loadKeyMaterial(keystoreFile.getFile()、keystorePass.toCharArray()、kmopEncKeyPass.toCharArray()、new PrivateKeyStrategy()){
@凌驾
公共字符串选择器(映射别名、套接字){
返回kmopEncKeyAlias;
}})
.loadTrustMaterial(新信任策略)(){
@凌驾
公共布尔isTrusted(X509Certificate[]链,字符串authType)引发CertificateException{
返回true;
}})
.build();
}捕获(例外e){
logger.error(“初始化SSLContext时出错:”+e.getMessage(),e);
抛出新的FatalException(e.getMessage(),e);
}
SSLConnectionSocketFactory sslsf=新的SSLConnectionSocketFactory(sslContext);
但是,它总是在
loadKeyMaterial(…)
上返回“java.security.UnrecoverableKeyException:无法恢复密钥”。 在调试这个方法时,我可以看到他成功地加载了密钥库,并且它包含了我在其中创建的密钥。但是,当随后尝试加载与密码kmopEncKeyPass关联的密钥条目时,它将返回不可恢复的密钥异常

My(JKS)密钥库有两个(自签名)条目“kmop enc”用于SSL握手,而“kmop sign”用于消息的SSL签名。别名kmop enc(参数kmopEncKeyPass)的密码与密钥库(参数keystorePass)的密码相同。使用自定义PrivateKeyStrategy,我希望确保“kmop enc”作为别名返回,而不是“kmop sign”(具有不同的密码)


使用keystore-explorer.org验证我的密钥库表明我的密钥库一切正常。关于它为什么抛出不可恢复的KeyException有什么想法吗?

需要在调用
.loadKeyMaterial(…)
之前添加
.setKeyStoreType(“JKS”)