はじめに
これはopenldapサーバー側で遭遇した問題なのですが、Ubuntu 20.04 (focal)ベースのOpenldap v2.4コンテナを、Ubuntu 22.04 (jammy)のOpenLDAP v2.5コンテナに変更したところ問題が発生しました。
back_metaパッケージを利用して、バックエンドのldapサーバーに処理を移譲しているところで次のようなエラーメッセージに遭遇しました。
64c27001.25d3191a 0x7f750eed7640 TLS: peer cert untrusted or revoked (0x42)
64c27001.25d36ad4 0x7f750eed7640 TLS: can't connect: (unknown error code).
TLSと表示されているようにldaps(ポート636)アクセスをしていたところで表示されていて、コンテナを20.04から22.04ベースに上げると問題が発生します。
Dockerfile上で FROM ubuntu:focal
に戻すだけで問題は収束するので、22.04に変更したことで問題が発生したことはすぐに確認することができました。
参考資料
- https://serverfault.com/questions/1115147/openldap-certificates-untrusted-or-revoked
- https://curtin.readthedocs.io/en/latest/topics/config.html
結論
解決策はDockerfileでlibldap-common
パッケージを追加するだけです。
RUN apt-get update && DEBIAN_FRONTEND=noninteractive \
apt-get install -y --no-install-recommends slapd ldap-utils ca-certificates libldap-common
似たようなことはDockerHubに登録されている公式のhttpd(Apache HTTPd)コンテナでもあって、Issues #209を送ったこともありました。
Ubuntu 20.04では明示的に記述する必要のなかったlibldap-common
パッケージですが、Ubuntu22.04ではこれを追加すれば問題は解決します。
libldap-commonパッケージの役割
/etc/ldap/ldap.conf を配置することが、このパッケージの役割です。
中にはCAファイルを参照するようになっているので、TLS証明書のCAを検証できなかったことが原因かもしれないので、確認しておきます。
# TLS certificates (needed for GnuTLS)
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
ここで指定している/etc/ssl/certs/ca-certificates.crtファイル自体は、ca-certificatesパッケージに含まれる/usr/sbin/update-ca-certificatesスクリプトによって生成されています。
TLS_CACERT行を削除してみる
libldap-commonパッケージをインストールした上で/etc/ldap/ldap.confのTLS_CACERTのパスを変更してから症状が再現するか確認してみます。
RUN sed -i -e 's!TLS_CACERT!#TLS_CACERT!' /etc/ldap/ldap.conf
この変更を行うと、libldap-commonパッケージを導入してもサーバーに接続できない問題が再現します。
/etc/ldap/ldap.confからCA局の情報を取得できないことが原因だと分かりました。
さいごに
Ubuntu 22.04とLDAP関連の操作は割と一般的だと思うのですが、これまで他のパッケージとの依存関係があるとして自動的に導入されていたlibldap-commonパッケージが独立したパッケージになっていることは他のパッケージでも問題になりそうです。
依存関係から推奨パッケージになってしまうことは、最近のTLSがデフォルトになってきた最近の動きと逆行するようにも感じられるので少し心配です。