首页 > 解决方案 > 在 jenkins 中配置 LDAP 全局设置

问题描述

我已经设置了一个 Jenkins 实例,并且正在尝试设置 LDAP 并收到此错误

无法连接到 ldaps://server.domain.com:636 : javax.naming.CommunicationException: server.domain.com:636 [根异常是 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径]

目标服务器正在使用自签名证书。有没有办法禁用认证检查?在另一个 Web 服务器实例中,我们运行它

AUTH_LDAP_GLOBAL_OPTIONS = {
ldap.OPT_X_TLS_REQUIRE_CERT: False }

使用 Jenkins 时是否有类似的选项?

标签: jenkinsldapjenkins-plugins

解决方案


您可以覆盖 Java 默认 SSL 工厂,例如https://plugins.jenkins.io/skip-certificate-check

或者,您可以通过获取证书公钥并将其导入您的 ./jre/lib/security/cacert 信任库来信任该证书。

export JAVA_HOME='/path/to/your/jre'
export LDAPHOST='LDAPHOST01.domain.ccTLD'
export LDAPSSLPORT='636'
export CERTFILENAME='/tmp/ldapcert.cer'

echo "" | openssl s_client -connect $LDAPHOST:$LDAPSSLPORT 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $CERTFILENAME
keytool -import -trustcacerts -alias $LDAPHOST -file $CERTFILENAME -keystore $JAVA_HOME/lib/security/cacerts

导入证书时,系统会要求您输入密钥库密码。默认值为'changeit' ...否则无论您将其更改为什么。将显示证书的详细信息,并询问您是否真的要信任该证书。

[lisa@linux02 checkSSLCertExpiry]# keytool -import -trustcacerts -alias $LDAPHOST -file $CERTFILENAME -keystore $JAVA_HOME/lib/security/cacerts
输入密钥库密码:
    所有者:CN=LDAPHOST01
    颁发者:CN=LDAPHOST01
    序列号:3a2542463f2d59bb4018f9e9179dd6a8
    有效期:2014 年 6 月 2 日星期一 16:55:08 EDT 至:2019 年 6 月 2 日星期日 16:55:08 EDT
    证书指纹:
             MD5:C3:33:62:B4:A8:30:05:54:3A:F9:AE:99:66:35:EB:22
             SHA1:FA:C2:7B:5D:BF:74:05:58:EF:37:F1:AD:8D:8B:DF:02:93:4C:D8:7E
             SHA256: BE:D6:DF:A9:4F:82:6B:AF:2C:C7:45:9B:B7:A4:0A:B4:9A:81:DB:8E:49:A2:38:16: 49:83:F7:4C:D5:EC:61:E0
    签名算法名称:SHA1withRSA
    主题公钥算法:2048 位 RSA 密钥
    ...
    #4:ObjectId:2.5.29.17 关键性=假
    主题替代名称 [
      DNS 名称:LDAPHOST01
      DNS名称:LDAPHOST01.domain.ccTLD
    ]
    相信这个证书?[否]:是的
    证书已添加到密钥库

用于验证证书是否存在于商店中的 keytool 命令:

    [lisa@linux02 checkSSLCertExpiry]# keytool -list -keystore $JAVA_HOME/lib/security/cacerts -alias $LDAPHOST
    输入密钥库密码:
    LDAPHOST01.domain.ccTLD,2018 年 9 月 28 日,trustedCertEntry,
    证书指纹(SHA1):FA:C2:7B:5D:BF:74:05:58:EF:37:F1:AD:8D:8B:DF:02:93:4C:D8:7E

覆盖 Java 的默认信任机制是一次性的,但显然会消除验证证书所带来的所有安全性。信任 LDAP 服务器的证书意味着每次更新证书时您都需要知道,并且您需要将证书导入到您的 cacerts 文件中。

为了避免在目录服务器证书过期时每年或两年都发生身份验证失败,我设置了一个具有相当长(10 年左右)有效期的证书颁发机构 (CA)。您可以使用专用的 PKI 基础设施或简单的 OpenSSL 来做到这一点。通过将 CA 的公钥导入 cacerts,您信任针对 CA 颁发的任何证书。因此,如果目录证书每年更新一次,您无需执行任何操作。在 CA 证书被替换的十年后,您需要将新的 CA 证书添加到存储中。


推荐阅读