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 / 问题 / 1042815
Accepted
Timor
Timor
Asked: 2020-11-17 15:53:38 +0800 CST2020-11-17 15:53:38 +0800 CST 2020-11-17 15:53:38 +0800 CST

OpenLDAP 服务器:SSL 证书链接(让我们加密)无法按预期工作

  • 772

好吧,我担心这会很长。请多多包涵。

环境

我有一个在 Alpine 3.12.1 上运行的 OpenLDAP 2.4.50 服务器。它仅使用 let's encrypt 暂存证书为 LDAPS 提供服务(目前,在证书方面,prod 环境将没有什么不同)。具体来说,它使用incert.pem引用。一切正常,我可以使用 ApacheDirectoryStudio 连接和使用它(承认我信任主机,尽管证书看起来很臭)。与任何OpenLDAP客户端(例如或)连接需要一个由. 这就是事情变得有趣的地方。olcTLSCertificateFilecn=configldapsearchldapmodifyTLS_CACERT/etc/openldap/ldap.confcat intermediate.pem root.pem > rootchain.pem

与 let's encrypt 合作过的人都知道,let's encrypt(或者更确切地说是 certbot)通常为我们提供以下内容:

  • privkey.pem- 私钥
  • cert.pem- 服务器的证书
  • chain.pem- 出服务器证书和 CA 之间的中间证书
  • fullchain.pem- 链从我们的服务器证书到没有根的根证书,又名。cat cert.pem chain.pem > fullchain.pem

没有root.pem和没有root-chain.pem,后者是cat chain.pem root.pem > rootchain.pem。

整个 webz 的人都认为,如果 Web 浏览器没有获得中间证书但知道根证书并以某种方式检索中间证书,那么他们会做一些黑魔法,我可能会根据自己的经验相信这一点。这些人说:对于“普通”服务器,只需向 CA 提供一个证书链,而不需要实际的 CA 证书作为您对服务器软件的证书(例如Get your certificate chain right)。在对这一切进行了更彻底的研究之后,这完全有道理,正如rfc 4346 第 7.4.2 节所述

“certificate_list
这是一个 X.509v3 证书的序列(链)。发送者的证书必须在列表中排在第一位。后面的每个证书必须直接证明它前面的证书。”

根据这一点,我应该能够向in和客户端提供fullChain.pem(即cat cert.pem chain.pem > fullchain.pem)根证书,并且每个客户端都应该正常运行。简单地说,不,他们没有。olcTLSCertificateFilecn=config/etc/openldap/ldap.confTLS_CACERT

有趣的事实

openssl verify -CAfile root.pem somechain.pem只有成功,如果根据 rfc 应该是错误的...?somechain.pem!cat chain.pem cert.pem > somechain.pem

结论

所以总结这一切:

  • 提供形式cat server.pem intermediate_lowest.pem intermediat_mid.pem intermediate-highest.pem为服务器证书的链式 PEM 是否正确?
  • 如果是这样或不是,我如何使用 OpenLDAP 正确执行此操作?

根据评论中的要求,这里有openssl s_client -connect两者的输出,仅带有根证书,并且带有中间证书链,后跟根证书。在请求时,slapd配置为使用fullchain.pemaka。cert.pem其次是chain.pem。

  • 仅根证书
    openssl s_client -showcerts -CAfile fakelerootx1.pem -connect directory.domain.tld:636 < /dev/null > with-rootcert.log 2>&1
depth=0 CN = *.domain.tld
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = *.domain.tld
verify error:num=21:unable to verify the first certificate
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:CN = *.domain.tld
   i:CN = Fake LE Intermediate X1
-----BEGIN CERTIFICATE-----
[ cert data removed, it is the single cert.pem from lets encrypt ]
-----END CERTIFICATE-----
---
Server certificate
subject=CN = *.domain.tld

issuer=CN = Fake LE Intermediate X1

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1899 bytes and written 401 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
DONE
  • 由中间体制成的链,然后是根
    openssl s_client -showcerts -CAfile fakerootchain.pem -connect directory.domain.tld:636 < /dev/null > with-root_and_intermediate_cert.log 2>&1
depth=2 CN = Fake LE Root X1
verify return:1
depth=1 CN = Fake LE Intermediate X1
verify return:1
depth=0 CN = *.domain.tld
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:CN = *.domain.tld
   i:CN = Fake LE Intermediate X1
-----BEGIN CERTIFICATE-----
[ cert data removed, it is the single cert.pem from lets encrypt, again ]
-----END CERTIFICATE-----
---
Server certificate
subject=CN = *.domain.tld

issuer=CN = Fake LE Intermediate X1

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1899 bytes and written 401 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
DONE
openldap ssl-certificate openssl lets-encrypt
  • 3 3 个回答
  • 1128 Views

3 个回答

  • Voted
  1. Hassan
    2020-12-25T04:04:08+08:002020-12-25T04:04:08+08:00

    正如@Timor 所说:

    OpenLDAP 的 slapd 根本不会在 TLS 握手时将证书链发送给客户端,即使已将一束服务器证书、中间证书作为其证书提供给它。

    当我使用olcSyncrepl复制 ldaps 服务器时遇到了这个问题,tls_reqcert=demand并且 slapd 正在生成ldap_sasl_bind_s failed (-1)错误。

    我发现一个简单的解决方法是将中间证书放入文件(可能/etc/ssl/certs/ca-certificates.crt在 ubuntu 中)并tls_cacert=/etc/ssl/certs/ca-certificates.crt放入olcSyncrepl.

    • 2
  2. Best Answer
    Timor
    2020-11-23T03:52:14+08:002020-11-23T03:52:14+08:00

    OpenLDAPslapd在 TLS 握手时根本不会将证书链发送给客户端,即使捆绑了服务器证书,中间证书也已作为其证书提供给它。

    不关闭客户端上的证书验证的唯一合适的解决方法如下。

    • 从中间证书、根证书创建证书包
    • 使客户端将此捆绑包用作受信任的 CA 证书,因此它可以分解完整的链并进行验证;这至少适用于针对 OpenLDAP 库编译的软件
      • OpenLDAP 命令行客户端为ldapmodify, ldapsearch:
        添加TLS_CACERT imedrootbundle.pem到~/.ldaprc系统范围或系统范围/etc/openldap/ldap.conf
      • dovecot:
        添加tls_ca_cert_file = imedrootbundle.pem到您的/etc/dovecot/dovecot-ldap.conf.ext文件中
      • 后缀:
        添加tls_ca_cert_file = imedrootbundle.pem到您的所有cf文件中,用作后缀字典来查询您的目录

    但是请记住,根证书不是由 let's encrypt 的 certbot 提供的,并且将来可能会更改,从而使您的中间证书、根证书无用。我用 certbot 设置了一个钩子脚本,它检查中间证书的颁发者,并尝试根据我所知道的选择正确的根证书。如果找不到,它会抱怨。这至少在流程的早期以受控方式破坏了一切。

    • 1
  3. Gerald Schneider
    2020-11-18T05:53:56+08:002020-11-18T05:53:56+08:00

    我已经有一段时间没有在 OpenLDAP 中使用 Let's Encrypt 证书了,但对我来说,没有必要创建一个包含链的文件。我只有来自我的 certbot renew-hook 脚本:

    cp /etc/letsencrypt/live/$domain/* /etc/ldap/ssl/
    chown -R openldap:openldap /etc/ldap/ssl/
    chmod 640 /etc/ldap/ssl/*
    /etc/init.d/slapd force-reload >/dev/null
    
    • 0

相关问题

  • OpenLDAP 无效凭证

  • 从 OpenLDAP 检索操作属性

  • 为 Mac 网络使用 Linux 和 Open LDAP

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

  • 将 OpenLDAP 实现为目录而不是控制网络访问的指南?[关闭]

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