Package: release.debian.org Severity: normal Tags: trixie X-Debbugs-Cc: [email protected] Control: affects -1 + src:erlang-p1-tls User: [email protected] Usertags: pu
[ Reason ] Let's Encrypt has recently ended the support for TLS Client Authentication in their certificates, see https://letsencrypt.org/2025/05/14/ending-tls-client-authentication and https://blog.prosody.im/2026-letsencrypt-changes/, as well as Debian bugs #1127369 + #1128568. This breaks communication with ejabberd servers, as they use the certificate also in client mode for server-to-server connections. To permit s2s communication with the new certifcates, both the erlang-p1-tls package and the ejabberd package must be updated. If the ejabberd-contrib package is used, that one must also be updated to a version built against the updated ejabberd package. [ Impact ] Without addressing this, federation between XMPP servers (s2s) will become more and more broken as more and more servers renew certificates which are then missing the client authentication flag. [ Tests ] I have deployed the updated package to my own server together with updated ejabberd + ejabberd-contrib packages, after which I could finally contact other ejabberd servers again that already run recent Let's Encrypt certificates without the client authentication flag. [ Risks ] None. Changes are trivial. [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Changes ] Add upstream commit as patch which allows accepting client certificates without the client purpose flag. [ Other info ] The fix is already part of current ejabberd releases and thereby also fixed in unstable. I will upload to proposed-updates right away.
diff -Nru erlang-p1-tls-1.1.22/debian/changelog erlang-p1-tls-1.1.22/debian/changelog --- erlang-p1-tls-1.1.22/debian/changelog 2025-02-09 11:09:55.000000000 +0100 +++ erlang-p1-tls-1.1.22/debian/changelog 2026-02-10 19:41:06.000000000 +0100 @@ -1,3 +1,10 @@ +erlang-p1-tls (1.1.22-1+deb13u1) trixie; urgency=medium + + * Add upstream commit which allows accepting client certificates without + the sslclient purpose flag (Closes: #1127369) + + -- Philipp Huebner <[email protected]> Tue, 10 Feb 2026 19:41:06 +0100 + erlang-p1-tls (1.1.22-1) unstable; urgency=medium * New upstream version 1.1.22 diff -Nru erlang-p1-tls-1.1.22/debian/patches/f1e55d6d6bdf109ebc48dda880d028c95f349c3b.patch erlang-p1-tls-1.1.22/debian/patches/f1e55d6d6bdf109ebc48dda880d028c95f349c3b.patch --- erlang-p1-tls-1.1.22/debian/patches/f1e55d6d6bdf109ebc48dda880d028c95f349c3b.patch 1970-01-01 01:00:00.000000000 +0100 +++ erlang-p1-tls-1.1.22/debian/patches/f1e55d6d6bdf109ebc48dda880d028c95f349c3b.patch 2026-02-10 19:41:06.000000000 +0100 @@ -0,0 +1,111 @@ +From f1e55d6d6bdf109ebc48dda880d028c95f349c3b Mon Sep 17 00:00:00 2001 +From: Pawel Chmielowski <[email protected]> +Date: Mon, 7 Jul 2025 10:13:50 +0200 +Subject: [PATCH] Add flag to allow accepting client cert without sslclient + purpose flag + +--- + c_src/fast_tls.c | 22 ++++++++++++++++++++-- + src/fast_tls.erl | 7 ++++++- + 2 files changed, 26 insertions(+), 3 deletions(-) + +Index: erlang-p1-tls/c_src/fast_tls.c +=================================================================== +--- erlang-p1-tls.orig/c_src/fast_tls.c ++++ erlang-p1-tls/c_src/fast_tls.c +@@ -26,6 +26,7 @@ + #include <openssl/decoder.h> + #include <openssl/provider.h> + #endif ++#include <openssl/x509v3.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <stdint.h> +@@ -263,6 +264,19 @@ static int verify_callback(int preverify + } + + /* ++ * Override cert purpose, to accept certificates that have only ++ * server purpose flag as client certificate (needed for s2s authentication). ++ */ ++static int cert_verify_callback(X509_STORE_CTX *x509, void *ptr) { ++ X509_VERIFY_PARAM *param = X509_STORE_CTX_get0_param(x509); ++ if (param) { ++ X509_VERIFY_PARAM_set_purpose(param, X509_PURPOSE_SSL_SERVER); ++ X509_VERIFY_PARAM_set_trust(param, X509_TRUST_SSL_SERVER); ++ } ++ return X509_verify_cert(x509); ++} ++ ++/* + * ECDHE is enabled only on OpenSSL 1.0.0e and later. + * See http://www.openssl.org/news/secadv_20110906.txt + * for details. +@@ -549,6 +563,7 @@ static int ssl_sni_callback(const SSL *s + #define SET_CERTIFICATE_FILE_CONNECT 2 + #define VERIFY_NONE 0x10000 + #define COMPRESSION_NONE 0x100000 ++#define OVERRIDE_CERT_PURPOSE 0x200000 + + static ERL_NIF_TERM ssl_error(ErlNifEnv *env, const char *errstr) { + size_t rlen; +@@ -579,6 +594,7 @@ static SSL_CTX *create_new_ctx(char *cer + char *ciphers, unsigned char *dh, size_t dh_size, + char *dh_file, char *ca_file, + unsigned int command, ++ unsigned long flags, + char **err_str) { + long verifyopts; + int res = 0; +@@ -650,6 +666,8 @@ static SSL_CTX *create_new_ctx(char *cer + SSL_CTX_set_mode(ctx, SSL_MODE_RELEASE_BUFFERS); + #endif + SSL_CTX_set_verify(ctx, verifyopts, verify_callback); ++ if (flags & OVERRIDE_CERT_PURPOSE) ++ SSL_CTX_set_cert_verify_callback(ctx, cert_verify_callback, NULL); + + #ifndef SSL_OP_NO_RENEGOTIATION + SSL_CTX_set_info_callback(ctx, &ssl_info_callback); +@@ -721,7 +739,7 @@ static char *create_ssl_for_cert(char *c + + enif_rwlock_rwlock(certs_map_lock); + SSL_CTX *ctx = create_new_ctx(cert_file, key_file, ciphers, dh, dh_size, +- dh_file, ca_file, command, &ret); ++ dh_file, ca_file, command,options & OVERRIDE_CERT_PURPOSE, &ret); + if (ret == NULL) { + new_info = enif_alloc(sizeof(cert_info_t)); + if (new_info) { +@@ -839,7 +857,7 @@ static ERL_NIF_TERM open_nif(ErlNifEnv * + state->dh_file = (char*)(state->dh + dh_bin.size + 1); + state->ca_file = state->dh_file + dhfile_bin.size + 1; + sni = state->ca_file + cafile_bin.size + 1; +- state->options = options; ++ state->options = options | (flags & OVERRIDE_CERT_PURPOSE); + state->command = command; + + memcpy(state->cert_file, certfile_bin.data, certfile_bin.size); +Index: erlang-p1-tls/src/fast_tls.erl +=================================================================== +--- erlang-p1-tls.orig/src/fast_tls.erl ++++ erlang-p1-tls/src/fast_tls.erl +@@ -67,6 +67,7 @@ + -define(VERIFY_NONE, 16#10000). + + -define(COMPRESSION_NONE, 16#100000). ++-define(OVERRIDE_CERT_PURPOSE, 16#200000). + + -define(PRINT(Format, Args), io:format(Format, Args)). + +@@ -148,7 +149,11 @@ tcp_to_tls(TCPSocket, Options) -> + true -> ?COMPRESSION_NONE; + false -> 0 + end, +- Flags = Flags1 bor Flags2, ++ Flags3 = case lists:member(override_cert_purpose, Options) of ++ true -> ?OVERRIDE_CERT_PURPOSE; ++ false -> 0 ++ end, ++ Flags = Flags1 bor Flags2 bor Flags3, + Ciphers = + case lists:keysearch(ciphers, 1, Options) of + {value, {ciphers, C}} -> diff -Nru erlang-p1-tls-1.1.22/debian/patches/series erlang-p1-tls-1.1.22/debian/patches/series --- erlang-p1-tls-1.1.22/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ erlang-p1-tls-1.1.22/debian/patches/series 2026-02-10 19:41:06.000000000 +0100 @@ -0,0 +1 @@ +f1e55d6d6bdf109ebc48dda880d028c95f349c3b.patch

