Spring Security with LDAP over SSL:需要更多细节

Posted

技术标签:

【中文标题】Spring Security with LDAP over SSL:需要更多细节【英文标题】:Spring Security with LDAP over SSL: need more details 【发布时间】:2014-07-28 22:23:34 【问题描述】:

我有一个通过LDAP 使用身份验证的网络应用程序。它可以完美运行,但需要生产版本才能使用 SSL。我们有一个运行在“ldaps://ourserver.com:636”的服务器,但是当我尝试连接到它时,Spring Security 会抛出以下异常:

根异常是 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径

Apache Directory Studio 还警告我关于未知证书,但允许忽略检查并最终连接并读取所需的数据。

这里有很多关于如何实现LDAP over SSL 的问题和答案,但没有一个提供完整的解决方案。我有two opportunities: 来制作certificate trusted 或完全禁用证书检查。无论我选择哪种方式,我都无法弄清楚如何使用 Spring Security 的机制:

    如果我选择使用 keytool 并使证书受信任,我无法弄清楚 JVM / Tomcat / Spring Security 将如何确定哪个 password I have defined (-keypass changeit)。 如果我选择禁用证书验证,我不知道应该放置the code 的位置。

我也很好奇 Apache Directory Studio 是如何在没有 keytool 导入的情况下使证书为自己信任的——这会显着降低应用程序的可移植性?这样的解决方案对我的 webapp 来说是完美的,但我还没有找到类似的东西。

【问题讨论】:

"... 或完全禁用证书检查" - 显然,这是个坏主意。这让您只有一种选择。 或许tekul/spring-security/samples会对你有所帮助。 【参考方案1】:

这是我能够使用的解决方案。我必须理解的关键是 JVM 和带有 webapp 的容器 都不需要知道别名和密码。 检查所有注册的证书是 JVM 头疼,这与您的 webapp 无关。不幸的是,该解决方案意味着您为整个 JVM 安装证书。这使得 webapp 的可移植性降低,但至少它可以正常工作。我决定在 webapp 源代码中提供以下 bash 脚本,以便其他开发人员可以轻松地在他们的机器上安装证书:

SERVER="mydomain:636" 
CRT_NAME="mydomain.crt"
CRT_ALIAS="mydomain_cert"

echo -n | openssl s_client -connect $SERVER | sed -ne '/-BEGIN
CERTIFICATE-/,/-END CERTIFICATE-/p' > $CRT_NAME

$JAVA_HOME/bin/keytool -import -alias $CRT_ALIAS -keystore $JAVA_HOME/lib/security/cacerts -file $CRT_NAME -storepass changeit

您可能希望添加额外的错误检查,我已将其省略以简化脚本。您将需要 root 权限才能启动第二个命令。

【讨论】:

以上是关于Spring Security with LDAP over SSL:需要更多细节的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC + Spring Security + LDAP

如何使用 spring-security-core-ldap 插件在 grails 中实现 LDAP 身份验证?

Grails,Spring Security LDAP 插件

Spring Security和LDAP身份验证

如何将 Spring Security 从 ldap 更改为 ldap starttls

使用 Spring Security 的 ldap 身份验证