【问题标题】:Unable to connect to LDAP server over ssl using spring template无法使用 spring 模板通过 ssl 连接到 LDAP 服务器
【发布时间】:2016-09-21 06:28:40
【问题描述】:

我正在使用 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>"

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 如果您在 openssl 中使用 -showcerts 选项,您可以看到链中的所有证书,直到颁发 CA。所有中间证书也需要导入。
  • 感谢 mvreijn,如何获取链中的所有证书以发布 CA。我尝试了 -showcerts 选项,但它显示 openssl 的选项无效。
  • -showcerts 工作正常,但没有显示所有证书,在最后一行我得到“验证返回码:21(无法验证第一个证书)”。是否有任何命令可以获取整个证书链,以便我可以将它们直接导入到我的 cacerts 中?
  • 抱歉,我离开了几天 - 很高兴看到您解决了这个问题。
  • 没关系,谢谢您的帮助

标签: java spring tomcat ssl ldap


【解决方案1】:

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

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

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

    >openssl s_client -showcerts -connect host:port
    

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

    我。 Convert PEM to PKCS#7

    二。 Split

  2. 在导入证书时使用“-trustcacerts”选项,以便将来自密钥库的证书视为信任链。

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

【讨论】:

  • 感谢 Roshith,如何获得完整的链到根 CA。有什么命令可以得到完整的链
  • 感谢 Roshith,我获得了完整链的实际证书并解决了问题。
  • @user1188867 乐于助人。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多