使用 cn=config 说服 openldap 在 Ubuntu 上使用 SSL

Rog*_*ger 4 linux ubuntu ssl openldap ldap

我根本无法让这个(到 openldap 的 TLS 连接)工作,希望得到一些帮助。

我在 ubuntu 10.04 LTS 上有一个可用的 openldap 服务器,它被配置为使用 cn=config 并且我能找到的大部分 TLS 信息似乎都使用旧的 slapd.conf 文件:-(

我一直在很大程度上遵循这里的说明https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html加上我在这里和其他地方读过的东西 - 这当然可能是问题的一部分我还没有完全理解这一切!

我创建了一个 ssl.ldif 文件如下;

dn:cn=config

add: olcTLSCipherSuite
olcTLSCipherSuite: TLSV1+RSA:!NULL
add: olcTLSCRLCheck
olcTLSCRLCheck: none
add: olcTLSVerifyClient
olcTLSVerifyClient: never
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ldap_cacert.pem
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/my.domain.com_slapd_cert.pem
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/my.domain.com_slapd_key.pem
Run Code Online (Sandbox Code Playgroud)

我使用以下命令行导入它

ldapmodify -x -D cn=admin,dc=mydomain,dc=com -W -f ssl.ldif
Run Code Online (Sandbox Code Playgroud)

我编辑了 /etc/default/slapd 使其具有以下服务行;

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
Run Code Online (Sandbox Code Playgroud)

每次我进行更改时,我都会重新启动 slapd /etc/init.d/slapd restart

以下用于测试非 TLS 连接的命令行工作正常;

ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \
-b dc=mydomain,dc=com -H "ldap://mydomain.com" "cn=roger*"
Run Code Online (Sandbox Code Playgroud)

但是当我使用这个命令行切换到 ldaps 时;

ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \
-b dc=mydomain,dc=com -H "ldaps://mydomain.com" "cn=roger*"
Run Code Online (Sandbox Code Playgroud)

这就是我得到的;

ldap_url_parse_ext(ldaps://mydomain.com)
ldap_create
ldap_url_parse_ext(ldaps://mydomain.com:636/??base)
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP mydomain.com:636
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 127.0.0.1:636
ldap_pvt_connect: fd: 3 tm: -1 async: 0
TLS: can't connect: A TLS packet with unexpected length was received..
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
Run Code Online (Sandbox Code Playgroud)

现在,如果我检查,netstat -al我可以看到;

tcp        0      0 *:www                   *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:https                 *:*                     LISTEN
tcp        0      0 *:ldaps                 *:*                     LISTEN
tcp        0      0 *:ldap                  *:*                     LISTEN
Run Code Online (Sandbox Code Playgroud)

我不确定这是否也很重要……我怀疑是;

openssl s_client -connect mydomain.com:636 -showcerts
CONNECTED(00000003)
916:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
Run Code Online (Sandbox Code Playgroud)

我想我已经把我所有的证书等都做好了,这里是一些检查的结果;

如果我这样做;

certtool -e --infile /etc/ssl/certs/ldap_cacert.pem
Run Code Online (Sandbox Code Playgroud)

我得到链验证输出:已验证。

certtool -e --infile /etc/ssl/certs/mydomain.com_slapd_cert.pem
Run Code Online (Sandbox Code Playgroud)

给出“certtool:最后一个证书不是自签名的”,但看起来还可以吗?

我哪里错了?当然,让 openldap 在 ubuntu 上安全运行应该很容易,而且不需要火箭科学学位!

有任何想法吗?

Ric*_*y C 7

Roger 的链接已经失效,在 Internet Archive 的 WayBack Machine 上也是如此,截至他更改网站之前的最后存档日期:https ://web.archive.org/web/20150530064010/http://rogermoffatt.com /2011/08/24/ubuntu-openldap-with-ssltls/

我还冒昧地将他的内容附加在下面:

起点

我将假设您有一个使用 cn=config(LDAP 数据库)进行配置而不是旧样式 slapd.conf 变体的有效 openldap 安装(未受保护)。如果您通过编辑 slapd.conf 进行更改,那么本文的其余部分不适合您!

步骤1

创建一些自签名证书以开始使用。如果您已经使用 openssl 为 Web 服务器创建了一些证书,那么首先会引起您注意的是它们不能与 ldap 一起使用。您需要不同格式的证书,为了生成它们,我们需要一个您还没有的新工具。

sudo -i
apt-get update
apt-get install gnutls-bin
certtool --generate-privkey --outfile /etc/ssl/private/ldap-ca-key.pem
certtool --generate-self-signed --load-privkey /etc/ssl/private/ldap-ca-key.pem --outfile /etc/ssl/certs/ldap-ca-cert.pem
Run Code Online (Sandbox Code Playgroud)

修复您的权限——生成的文件需要被 openldap 组读取。

为此,请将 openldap 用户添加到 ssl-cert 组,然后确保证书和密钥归 ssl-cert 组所有。请记住,目录 /etc/ssl/private 对其具有严格的权限,因此您需要正确处理。

adduser openldap ssl-cert
chgrp /etc/ssl/private/ldap-ca-key.pem
Run Code Online (Sandbox Code Playgroud)

第二步

创建合适的 ssl.ldif 文件以导入到配置数据库中。在这一点上值得一提的是,我在网上看到的那些都存在语法错误,导致它们无法工作——而且它们无声无息地失败了,这让你认为它们已经奏效了!请特别注意连字符在语法上很重要。

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap-ca-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap-ca-key.pem
Run Code Online (Sandbox Code Playgroud)

警告:不要太聪明,将 TLSCipherSuite 更改为像 HIGH:MEDIUM:-SSLv2 这样聪明的东西——这是一个 openssl 指令,您现在会发现您无法重新启动 slapd,因为它会在启动时失败:-( 诊断为此,尝试使用以下命令启动 slapd;

slapd -d 16383
Run Code Online (Sandbox Code Playgroud)

如果您这样做,您可能会看到以下内容;

TLS: could not set cipher list HIGH:MEDIUM:+SSLv2.
main: TLS init def ctx failed: -1
Run Code Online (Sandbox Code Playgroud)

如果你小心的话,你可以通过直接编辑 /etc/ldap/slapd.d/cn=config.ldif 来解决这个问题。

第三步

导入 ssl.ldif 文件并注意它工作时您应该看到的内容,而不是它不工作时您将看到的内容。另请注意,如果您多次运行此程序,则需要更改 ssl.ldif 文件中的添加以替换。

ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif -v
Run Code Online (Sandbox Code Playgroud)

-v 为您提供详细的输出。确保您看到打印出的新条目,如果它只是说:

modifying entry "cn=config"
modify complete
Run Code Online (Sandbox Code Playgroud)

那么这并不意味着它已经奏效。这很可能意味着它由于错误而没有处理文件,并且实际上不会进行任何更改。您需要看到它列出了它已修改的条目。例如,这是一个工作版本(使用替换,而不是添加)

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
replace olcTLSCipherSuite:
NORMAL
replace olcTLSCRLCheck:
none
replace olcTLSVerifyClient:
never
replace olcTLSCertificateFile:
/etc/ssl/certs/ldap2-ca-cert.pem
replace olcTLSCertificateKeyFile:
/etc/ssl/private/ldap2-ca-key.pem
modifying entry "cn=config"
modify complete
Run Code Online (Sandbox Code Playgroud)

第四步

确保 slapd 侦听 ldaps:// 连接 我们要再次编辑文件(是否还有其他人认为使用 cn=config 会造成比解决的麻烦更多?),这次我们需要编辑/etc/default/slapd和更改 SLAPD_SERVICES 行以便它具有 ldaps:/// 条目,如下所示;

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
Run Code Online (Sandbox Code Playgroud)

第五步

修复不受信任的证书问题。您可能认为我们现在已经完成了,但事实证明,另一个文件中有一个配置非常重要。如果您现在尝试连接,请使用绑定到 ldap 服务器的命令行,例如:

ldapsearch -d 9 -D “cn=admin,dc=mydomain,dc=com” -w adminpassword -b “dc=mydomain,dc=com” -H “ldaps://mydomain.com” “objectClass=*”
Run Code Online (Sandbox Code Playgroud)

你可能会得到;

TLS: peer cert untrusted or revoked (0x42)
TLS: can't connect: (unknown error code).
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请编辑文件 /etc/ldap/ldap.conf(请注意,这不是 slapd.conf 文件 - 它可能会令人困惑)并将下面的一行添加到可能是完全注释掉的文件中;TLS_REQCERT 从不

现在它应该可以工作了!

  • 请注意,我对他的内容没有版权,也不能保证它在解决问题方面的有效性。我只是不喜欢答案的关键部分几乎蒸发了。 (2认同)