AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 777017
Accepted
shaneoh
shaneoh
Asked: 2016-05-17 01:53:42 +0800 CST2016-05-17 01:53:42 +0800 CST 2016-05-17 01:53:42 +0800 CST

在 openLDAP 中使用 Lets Encrypt 证书

  • 772

我已经运行了几个月的 openLDAP 服务器,我们使用它来对许多应用程序进行身份验证。以前的工作人员设置了服务器,它似乎不是标准安装,但它非常简单。

最近我们的一个 CA 证书过期了,我们决定用 Let's Encrypt 替换它。我的经理更换了服务器上的证书。

它适用于 Web 应用程序(LDAP 管理器、自助服务密码更改),但是没有客户端可以针对它进行身份验证。例如,如果我尝试测试 Redmine LDAP 配置,我会收到一条消息“无法连接(SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A)”

针对它测试 Nexus 身份验证只是无法连接。

令人沮丧的是,LDAP 服务器或应用程序的日志中没有任何内容表明失败的原因。我的调查使我相信这是如何配置证书/密钥的事情,但我已经尝试了我能想到的所有东西以及我可以在网上找到的所有东西,但没有任何效果。

环境细节是:

Debian 8 openLDAP openldap-2.4.40

我的配置如下:

/etc/ldap/ldap.conf

# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/letsencrypt/live/myserver.com/fullchain.pem

/etc/ldap/slapd.d/cn=config.ldif

dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal
entryUUID: c6dd9e40-9dc2-1035-8c03-add74f928a5e
creatorsName: cn=config
createTimestamp: 20160423171552Z
entryCSN: 20160423171552.629347Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20160423171552Z

如果我测试连接:

admin@ldap:~$ sudo openssl s_client -connect localhost:636 -showcerts -state -CAfile /etc/letsencrypt/live/myserver.com/fullchain.pem
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
140394818631312:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE

有谁知道我错过了什么?

编辑

根据@84104 的建议,我将 tls.ldif 文件编辑为如下所示:

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/live/myserver/fullchain.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/myserver/cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/myserver/privkey.pem

然后运行命令:

ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif

但是我现在得到的输出是:

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)

我发现这可能是由于证书或密钥文件的权限造成的,但我将它们更改为与以前使用的文件上的完全匹配,但仍然收到此消息。

我再次为我缺乏对该主题的一般知识而道歉,但任何人都可以提出其他建议吗?

编辑

根据建议,我更改了 tls.ldif 并将所有命令从替换更改为删除,然后再次运行 ldapmodify 命令。还有另一个错误。

    admin@ldap:/etc/ansible_ldif_work$ sudo ldapmodify -Y EXTERNAL -H   ldapi:/// -f tls.remove.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Inappropriate matching (18)
        additional info: modify/delete: olcTLSCACertificateFile: no equality matching rule
ldap openldap ssl-certificate lets-encrypt
  • 9 9 个回答
  • 19065 Views

9 个回答

  • Voted
  1. Best Answer
    Ghitea Andrei Paul
    2017-02-24T12:35:43+08:002017-02-24T12:35:43+08:00

    fullchain.pem 文件不是 cert.pem 文件上方证书链的串联,它是 chain.pem 和 cert.pem 文件的串联。

    chain.pem 文件和根权限文件必须连接到您将作为 olcTLSCACertificateFile 呈现给 slapd 的文件中

    privkey.pem 文件必须作为 olcTLSCertificateKeyFile 提供给 slapd。

    简单的 cert.pem 文件必须作为 olcTLSCertificateFile 提交给 slapd。

    我不确定连接的顺序是否重要,但这是我使用的顺序:cat chain.pem root.pem > ca.merged.crt

    您使用的 openssl 测试显示在这样设置时一切正常。

    可以在此处找到根权限文件: https ://www.identrust.com/certificates/trustid/root-download-x3.html

    测试:

    [root@█████ ssl]# openssl s_client -connect [已编辑]:636 -showcerts -state -CAfile ca.merged.crt
    已连接(00000003)
    SSL_connect:在/连接初始化之前
    SSL_connect:SSLv2/v3 写客户端 hello A
    SSL_connect:SSLv3 读取服务器 hello A
    depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
    验证返回:1
    depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
    验证返回:1
    深度=0 CN = [已编辑]
    验证返回:1
    SSL_connect:SSLv3 读取服务器证书A
    SSL_connect:SSLv3 读取服务器密钥交换 A
    SSL_connect:SSLv3 读取服务器完成 A
    SSL_connect:SSLv3 写客户端密钥交换 A
    SSL_connect:SSLv3 写入更改密码规范 A
    SSL_connect:SSLv3 写入完成 A
    SSL_connect:SSLv3 刷新数据
    SSL_connect:SSLv3 读取完成 A
    ---
    证书链
     0 秒:/CN=[已编辑]
       i:/C=US/O=让我们加密/CN=让我们加密权威 X3
    -----开始证书-----
    [已编辑]
    -----结束证书-----
     1 s:/C=US/O=让我们加密/CN=让我们加密权威 X3
       i:/O=数字签名信任公司/CN=DST Root CA X3
    -----开始证书-----
    [已编辑]
    -----结束证书-----
     2 s:/O=数字签名信任公司/CN=DST Root CA X3
       i:/O=数字签名信任公司/CN=DST Root CA X3
    -----开始证书-----
    [已编辑]
    -----结束证书-----
    ---
    服务器证书
    主题=/CN=[已编辑]
    issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
    ---
    未发送客户端证书 CA 名称
    服务器临时密钥:ECDH,secp384r1,384 位
    ---
    SSL 握手已读取 4417 字节并写入 405 字节
    ---
    新的,TLSv1/SSLv3,密码是 ECDHE-RSA-AES256-GCM-SHA384
    服务器公钥是 4096 位
    支持安全重新协商
    压缩:无
    扩展:无
    SSL-会话:
        协议:TLSv1.2
        密码:ECDHE-RSA-AES256-GCM-SHA384
        会话 ID:[已编辑]
        会话 ID-ctx:
        万能钥匙:[已编辑]
        键-Arg:无
        Krb5 主体:无
        PSK 身份:无
        PSK 身份提示:无
        开始时间:1487882605
        超时:300(秒)
        验证返回码:0(ok)
    ---
    
    • 12
  2. boggle
    2016-05-24T00:52:19+08:002016-05-24T00:52:19+08:00

    您是否启用了任何额外的安全措施(如 apparmor)来限制对证书的读取访问?我收到了同样的错误消息ldap_modify: Other (e.g., implementation specific) error (80),因为 apparmor 不允许 openldap 访问 let's encrypt 证书:

    以下步骤为我解决了这个问题:

    • 将行添加到/etc/apparmor.d/local/usr.sbin.slapd:/etc/letsencrypt/** r,

    • service apparmor restart

    • 6
  3. 84104
    2016-05-19T15:52:31+08:002016-05-19T15:52:31+08:00

    您的 OpenLDAP 服务器似乎没有配置 TLS。

    您/etc/ldap/slapd.d/cn=config.ldif应该具有以下内容:

    olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key
    olcTLSCACertificateFile: /etc/ldap/ssl/ldap_ca.cert
    olcTLSCertificateFile: /etc/ldap/ssl/ldap.cert
    olcTLSCipherSuite: HIGH:!aNull:!MD5:@STRENGTH
    olcTLSProtocolMin: 3.1
    

    您应该通过 ldapmodify 添加它。

    • 4
  4. zzeroo
    2017-07-23T13:45:17+08:002017-07-23T13:45:17+08:00

    有一篇关于这个主题的漂亮博客文章。它适用于我https://www.dahlem.uk/display/deb/Configure+and+enable+TLS+for+OpenLDAP

    更新(archive.org 上的博客备份):https ://web.archive.org/web/20161023210915/http://www.dahlem.uk:80/display/deb/Configure+and+enable+TLS+for+开放式LDAP

    我的系统是这样的:

    # lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description:    Debian GNU/Linux 8.8 (jessie)
    Release:        8.8
    Codename:       jessie
    
    # slapd -V
    @(#) $OpenLDAP: slapd  (Jul 16 2017 19:57:41) $
            Debian OpenLDAP Maintainers <[email protected]>
    

    在这里快速浏览一下。处理文件系统访问letsencrypt ...

    useradd letsencrypt
    chown openldap:letsencrypt /etc/letsencrypt/ -R
    usermod -a -G letsencrypt openldap
    

    激活服务...

    # /etc/default/slapd
    SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
    

    并告诉 openldap 你的证书......

    # /root/add_ssl.ldif
    dn: cn=config
    changetype: modify
    add: olcTLSCipherSuite
    olcTLSCipherSuite: NORMAL
    -
    add: olcTLSCRLCheck
    olcTLSCRLCheck: none
    -
    add: olcTLSVerifyClient
    olcTLSVerifyClient: never
    -
    add: olcTLSCACertificateFile
    olcTLSCACertificateFile: /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem
    -
    add: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/letsencrypt/live/YOURDOMAIN/cert.pem
    -
    add: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/letsencrypt/live/YOURDOMAIN/privkey.pem
    -
    add: olcTLSProtocolMin
    olcTLSProtocolMin: 3.3
    

    读取 ldif 文件...

    ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl.ldif
    

    最后重新启动并检查 slapd。

    systemctl restart slapd.service
    systemctl status slapd.service
    
    • 4
  5. M Kummer
    2018-01-30T14:37:08+08:002018-01-30T14:37:08+08:00

    我在使用OpenLDAP设置Lets Encrypt的认证时遇到了同样的问题

    错误:

    ~ # ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl.ldif
    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "cn=config"
    ldap_modify: Other (e.g., implementation specific) error (80)
    

    日志文件包含:

    ... apparmor="DENIED" operation="open" profile="/usr/sbin/slapd" name="/etc/letsencrypt/archive/your.domain.tld/fullchain1.pem" ...
    

    我找到了以下解决方案:

    1. 编辑文件/etc/apparmor.d/usr.sbin.slapd
    2. 添加行:/etc/letsencrypt/archive/your.domain.tld/* r,
    3. 重启*apparmor*:服务apparmor重启`
    4. 现在ldapmodify再次执行
    • 2
  6. Vincent
    2019-09-11T08:00:43+08:002019-09-11T08:00:43+08:00

    我遇到了同样的问题,几个小时后发现最简单的解决方案是:将 pem 文件复制到 /etc/openldap/certs 并将 fullchain.pem 用于 olcTLSCACertificateFile。(似乎不需要根 CA)。同样重要的是:olcTLSCertificateFile 和 olcTLSCertificateKeyFile 访问权限应分别为 644 ldap ldap 和 600 ldap ldap。

    执行此操作的 ansible playbook 看起来像这样,以使其易于自动化:

    - hosts: ldap
      gather_facts: false
      become: true
      tasks:
        - name: Copy cert.pem
          copy: 
            src: "/mnt/data/main/ansible/letsencrypt/config/live/appdev.elabs.svcs.entsvcs.com/cert.pem"
            dest: "/etc/openldap/certs/olcTLSCertificateFile"
            backup: yes
            owner: ldap
            group: ldap
            mode: '0644'
        - name: Copy fullchain.pem
          copy: 
            src: "/mnt/data/main/ansible/letsencrypt/config/live/appdev.elabs.svcs.entsvcs.com/fullchain.pem"
            dest: "/etc/openldap/certs/olcTLSCACertificateFile"
            backup: yes
            owner: root
            group: root
            mode: '0644'
        - name: Copy privkey.pem
          copy: 
            src: "/mnt/data/main/ansible/letsencrypt/config/live/appdev.elabs.svcs.entsvcs.com/privkey.pem"
            dest: "/etc/openldap/certs/olcTLSCertificateKeyFile"
            backup: yes
            owner: ldap
            group: ldap
            mode: '0600'
    
    • 2
  7. fri.K
    2018-02-15T09:54:29+08:002018-02-15T09:54:29+08:00

    当我将“实时”路径更改为“存档”时,我设法做到了:

    dn: cn=config
    changetype: modify
    replace: olcTLSCACertificateFile
    olcTLSCACertificateFile: /etc/letsencrypt/archive/SOMEDOMAIN/fullchain1.pem
    -
    replace: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/letsencrypt/archive/SOMEDOMAIN/cert1.pem
    -
    replace: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/letsencrypt/archive/SOMEDOMAIN/privkey1.pem
    

    并允许 openldap 用户使用例如读取这些文件: setfacl -m "u:openldap:r" /etc/letsencrypt/archive/SOMEDOMAIN/{fullchain1,cert1,privkey1}.pem

    • 0
  8. Cram
    2020-06-06T03:33:20+08:002020-06-06T03:33:20+08:00

    当你得到一个 fullchain.pem 时,你根本不需要配置 CA,因为这个文件已经包含了根 ca、中间件和服务器证书。

    使用fullchain.pem作为olcTLSCertificateFile和 privkey.pem 作为 olcTLSCertificateKeyFile。

    如果您收到错误 80 =>(其他(例如,特定于实现)错误 (80)):

    1. 使用一个 ldapmodify 修改这两个属性很重要(如果您先设置 olcTLSCertificateKeyFile 然后设置 olcTLSCertificateFile ,反之亦然)
    2. 检查 privkey.pem 文件模式是否为 600,所有者是您的 SLAPD_USER 并且 SLAPD_USER 可以通过完整路径读取文件。
    3. 检查 fullchain.pem 文件模式是否为 644,所有者是您的 SLAPD_USER 并且 SLAPD_USER 可以通过完整路径读取文件。
    4. 检查 apparmor、selinux 等是否阻止 SLAPD_USER 的访问

    编写一个 ldapmodify 文件 - ssl.mod:

    dn: cn=config
    changetype: modify
    replace: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /path/to/your/letsencrypt/privkey.pem
    -
    replace: olcTLSCertificateFile
    olcTLSCertificateFile: /path/to/your/letsencrypt/fullchain.pem
    

    应用配置:

    ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.mod
    

    很酷的是,您可以将最后一个命令用作 certbot --deploy-hook 并旋转证书,而无需在 renew 上重新启动 slapd。

    • 0
  9. Alexis Huxley
    2021-12-13T10:08:27+08:002021-12-13T10:08:27+08:00

    stackexchange 上和其他地方的许多人都指出,节的权限和顺序很重要,但最终帮助我的是:

    1. 将包含三个节的一个 .ldif 文件拆分为三个 .ldif 文件,每个文件包含一个节(它们不需要一次全部加载!)
    2. 尝试一一加载(例如加载#1:失败;加载#2:失败;加载#3:成功)
    3. 再次重复所有失败的(例如加载#1:失败;加载#2:成功)
    4. 再次重复所有失败的(例如加载#1:成功)

    通过第三个循环,我知道它们必须按什么顺序加载。

    • 0

相关问题

  • Cygwin sshd 和 LDAP 身份验证

  • 从 OpenLDAP 检索操作属性

  • 为 Mac 网络使用 Linux 和 Open LDAP

  • 使用LDAP服务器身份验证的Linux中单个用户的多个登录名

  • 使用 smbldap 管理用户/组的 Web 前端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve