Java 使用密钥库api的内存密钥库';找不到请求目标的有效证书路径';

Java 使用密钥库api的内存密钥库';找不到请求目标的有效证书路径';,java,spring,ssl,ldap,spring-ldap,Java,Spring,Ssl,Ldap,Spring Ldap,我正在尝试为单个ldap请求创建inmemory密钥库。Ldap连接和证书可以更改,因此我无法将它们存储在任何位置 springldap对多个Ldap连接不是很狂热 public LdapContextSource buildLdapContext(最终LdapConnection连接){ 最终LdapContextSource上下文=新的LdapContextSource(); setBase(connection.getBaseDN()); setUrl(connection.getConn

我正在尝试为单个ldap请求创建inmemory密钥库。Ldap连接和证书可以更改,因此我无法将它们存储在任何位置

springldap对多个Ldap连接不是很狂热

public LdapContextSource buildLdapContext(最终LdapConnection连接){
最终LdapContextSource上下文=新的LdapContextSource();
setBase(connection.getBaseDN());
setUrl(connection.getConnectionUrl());
context.setPassword(connection.getAdminPassword());
setUserDn(connection.getUserDN());
if(connection.getProtocol()==LdapProtocol.LDAPS){
final DefaultTlsDirContextAuthenticationStrategy authenticationStrategy=新的DefaultTlsDirContextAuthenticationStrategy();
authenticationStrategy.setsssocketfactory(ldapsslssocketfactorybuilder.buildsslssocketfactory(连接));
setAuthenticationStrategy(authenticationStrategy);
}
context.afterPropertieSet();
返回上下文;
}
公共SSLSocketFactory构建SSLSocketFactory(最终LDA连接){
试一试{
最终密钥存储=buildKeyStore(连接);
final TrustManagerFactory tmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(存储);
最终SSLContext ctx=SSLContext.getInstance(“SSL”);
init(null,tmf.getTrustManager(),null);
返回ctx.getSocketFactory();
}捕获(例外e){
抛出新的LdapException(e.getMessage(),e);
}
}
private KeyStore buildKeyStore(最终LdapConnection LdapConnection){
试一试{
//加载内存密钥库
final KeyStore KeyStore=KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null);
//解码证书
字节[]decoded=Base64.decodeBase64(ldapConnection.getSslCertificate()
.replaceAll(X509Factory.BEGIN_CERT,“”)
.replaceAll(X509Factory.END_CERT,“”)
.trim().getBytes(StandardCharsets.UTF_8));
//装载证书
CertificateFactory CertificateFactory=CertificateFactory.getInstance(“x.509”);
Certificate cert=certificateFactory.generateCertificate(新的ByteArrayInputStream(已解码));
setCertificateEntry(ldapConnection.getConnectionUrl(),cert);
返回密钥库;
}捕获(例外e){
log.error(e.getMessage(),e);
抛出新的LdapException(e.getMessage(),e);
}
}

我希望存储的公钥用于连接到ldap服务器,但我得到的结果是“无法找到请求目标的有效证书路径”

我设法解决了这个问题。代码工作正常,问题是我们使用的是无法验证的自签名证书。我们所要做的就是把证书放在cacerts文件中。自签名证书是它们自己的证书颁发机构,因此必须放入cacerts文件中,该文件位于$JAVA_HOME/jre/lib/security/cacerts中。

请添加
-Djavax.net.debug=SSL、握手、,trustmanager
作为JVM选项,并检查日志?这反过来意味着您不需要大部分代码。我们使用CA签名证书时会这样做