asterisk: regenerate self-signed TLS cert when DOMAIN_NAME changes
Vendor's entrypoint.sh only regenerates the self-signed cert if the file is missing or lacks a SAN extension -- it never checks whether the SAN actually matches the currently configured DOMAIN_NAME. Since /etc/asterisk/certs is a bind-mounted host directory, neither an update nor a full reinstall ever wipes it, so a domain entered once (even a placeholder, or one later changed) sticks in the cert indefinitely. Confirmed live: a box kept presenting a cert for a stale, originally- entered domain long after DOMAIN_NAME had changed and a full reinstall had run in between. Most SIP/TLS clients refuse a mismatched cert outright with no clear error, which was the actual cause of a "port's open but registration still fails" case -- firewall, coturn, and DNS had all already checked out clean. Patches the vendored entrypoint.sh (same guarded-sed pattern as the existing logger.conf patch) to also regenerate when the existing cert's SAN doesn't include the current DOMAIN_NAME. Verified against a scratch copy: missing cert regenerates, a cert already matching the domain is left alone, a mismatched domain now correctly regenerates and then stabilizes.
This commit is contained in:
@@ -385,6 +385,30 @@ _asterisk_refresh_vendor_files() {
|
|||||||
else
|
else
|
||||||
log_warning "entrypoint.sh logger.conf template changed upstream — security events won't be logged to a file. Update the sed patch in this installer."
|
log_warning "entrypoint.sh logger.conf template changed upstream — security events won't be logged to a file. Update the sed patch in this installer."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Regenerate the self-signed TLS cert when it doesn't match the current
|
||||||
|
# DOMAIN_NAME. Vendor's own check only asks "does the file exist" and
|
||||||
|
# "does it have a SAN extension" -- never "does the SAN match the domain
|
||||||
|
# actually configured now" -- so a domain entered once (even a
|
||||||
|
# placeholder, or one later changed) sticks in the cert FOREVER: it
|
||||||
|
# survives every subsequent update *and* full reinstall, because
|
||||||
|
# /etc/asterisk/certs is a bind-mounted host directory neither install
|
||||||
|
# mode ever wipes (the same reason pjsip.conf/devices survive reinstalls
|
||||||
|
# too). Confirmed live: a box's TLS transport kept presenting a cert for
|
||||||
|
# a stale, originally-entered domain long after DOMAIN_NAME had changed
|
||||||
|
# and a full reinstall had been run in between -- most SIP/TLS clients
|
||||||
|
# refuse a cert like that outright with no clear error, and this was the
|
||||||
|
# actual cause of a "port's open but registration still fails" case that
|
||||||
|
# every other check (firewall, coturn, DNS) had already come back clean.
|
||||||
|
if grep -q '^if \$regen_cert; then$' ./docker/entrypoint.sh; then
|
||||||
|
sed -i '/^if \$regen_cert; then$/i\
|
||||||
|
if [[ "$regen_cert" != true && -n "${DOMAIN_NAME:-}" ]] && ! openssl x509 -in /etc/asterisk/certs/server.crt -noout -ext subjectAltName 2>/dev/null | grep -q "DNS:${DOMAIN_NAME}"; then\
|
||||||
|
log_info "Existing TLS cert does not match current DOMAIN_NAME (${DOMAIN_NAME}) -- regenerating"\
|
||||||
|
regen_cert=true\
|
||||||
|
fi' ./docker/entrypoint.sh
|
||||||
|
else
|
||||||
|
log_warning "entrypoint.sh cert-regen check changed upstream — a stale-domain cert won't auto-regenerate. Update the sed patch in this installer."
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Shared: log rotation for logs/full (unbounded otherwise) ──────────────
|
# ── Shared: log rotation for logs/full (unbounded otherwise) ──────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user