java - 无法使用 spring 模板通过 ssl 连接到 LDAP 服务器

标签 java spring tomcat ssl ldap

我正在使用 spring 模板通过 ssl 连接到 ldap 服务器。我使用以下命令从服务器保存 ssl 证书:

echo -n | openssl s_client -connect <ldapserverip>:<port> | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ldapserver.pem

然后进入/jre/lib/security 目录,执行以下命令将证书添加到cacerts。

keytool -import -keystore cacerts -file ldapserver.pem

然后使用以下命令验证 cacerts 中条目列表中的计数:

keytool -list -keystore cacerts

我在 tomcat 中运行应用程序,tomcat 指向同一个 JDK_HOME。

在使用 spring 的 ldapTemplate 中使用 authenticate() 登录时,我在 tomcat 中收到以下异常。

Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

纯文本(没有 https)工作正常。我也尝试设置 VMArguments,但没有一个起作用。

-Djavax.net.ssl.trustStore="<path to cacerts file>"
-Djavax.net.ssl.trustStorePassword="<passphrase>"

我该如何解决这个问题?

谢谢

最佳答案

信任链看起来像是被打破了。两个可能的原因。

  1. 来自服务器的证书不是单个证书,而是到根 CA 的链,而您只导入了一个。您需要验证并导入完整的链。

    一个。要检查证书链,使用 openssl 转储它

    >openssl s_client -showcerts -connect host:port
    

    要导入链,您需要将 PEM 转换为 PKCS#7 或拆分。

    我。 Convert PEM to PKCS#7

    二。 Split

  2. 导入证书时使用“-trustcacerts”选项,以便将来自 keystore 的证书考虑用于信任链。

    >keytool -import -trustcacerts -file /path/ldapserver.pem -alias somealias -keystore /security/cacerts
    

关于java - 无法使用 spring 模板通过 ssl 连接到 LDAP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39608953/

相关文章:

java - JUnit:使用不同的配置运行一个测试

java - 有没有办法注入(inject)一个依赖项,该依赖项将根据注入(inject)的位置(使用 Spring 引导)使用特定的 bean?

java - Spring aop : Pointcut defined for subclasses but only one subclass is invoked

java - Hibernate - 将 orderBy() 添加到 DetachedCriteria 如果不存在?

java - Spring Boot无法连接MySQL : The server time zone value 'Mitteleuropäische Zeit' is unrecognized

regex - Apache http + mod-rewrite 到 Tomcat 以从 url 丢失应用程序子文件夹

jsp - validateJarFile 未在 eclipse 和 netbeans 中加载

session - Tomcat session 处理

java - 用java创建一个循环正方形

java - 如何在两个不同的页面中使用单个命令对象而不使其成为单例