v2.141
What's Changed
Fixed
- Admin lockout prevented on database backend switch (#96). Switching the database backend (SQLite ↔ PostgreSQL) no longer locks the admin out. Boolean and JSON columns are now coerced correctly when migrating rows from SQLite to PostgreSQL, the migration runs per-table in its own transaction so a single bad row no longer aborts the whole switch, and the active admin session survives the cutover.
- PostgreSQL backups via
pg_dump. The Docker image now shipspostgresql-client, so PostgreSQL-backed instances can produce nativepg_dumpbackups during backend migrations and scheduled backups.
Changed
- In-app help covers v2.128–v2.140 features in English plus all 8 translated languages (fr, de, es, it, ja, pt, uk, zh).
- README features and roadmap refreshed for v2.128 → v2.140.
Internal
- CI: backend test collection no longer fails on missing
SECRET_KEY/JWT_SECRET_KEY— workflow now exports test-mode env vars before pytest runs.
📜 Recent release history (last 2 versions)
[2.140] - 2026-04-27
Fixed
- Certificate SAN database columns now derived from the final SAN list (#94). When a CN is auto-promoted to an
rfc822NameSAN at issuance, thesan_email/san_dns/san_ip/san_uricolumns are now written from the canonical SAN list instead of the raw form payload, so DB queries match the X.509 extension. Migration027_backfill_san_emailre-parses existing certificate PEMs and backfills any rows that were out of sync (idempotent on SQLite and PostgreSQL). Thanks @Hemsby. - Certificate and CA files written to disk on creation (#95). Added SQLAlchemy
after_insertlisteners on theCertificateandCAmodels that immediately materialize.crt/.keyfiles underdata/certs/anddata/cas/for every creation path (UI, CSR signing, ACME, SCEP, import). The startup file-regeneration scan is kept as a safety net. File-write errors are logged but never abort the database transaction. Thanks @Hemsby.
[2.139] - 2026-04-27
Added
- ACME External Account Binding (EAB) — RFC 8555 §7.3.4. Full EAB credentials manager (backend models, API, UI under ACME → EAB Credentials). Operators can issue, list, rotate and revoke
kid/hmacpairs; clients (cert-manager, certbot, acme.sh) bind their account onnewAccountvia JWS over the MAC key. Brings UCM in line with public ACME CAs (Let's Encrypt EAB, ZeroSSL, Google Trust Services). - ACME custom DNS resolvers for DNS-01 validation. Per-account override of system resolvers when validating
_acme-challengeTXT records. Useful for split-horizon DNS, internal authoritatives, or when public resolvers cache stale records during automated renewals. - ACME on internal / private IPs — gated by
acme.allow_private_ipsSystemConfig (defaulttrue). HTTP-01 and TLS-ALPN-01 validation now works out of the box for RFC1918, loopback,.lan/.local/.corptargets — UCM's primary deployment model. Cloud metadata IPs (169.254.169.254) remain blocked unconditionally. - Kubernetes & cert-manager integration. Reference manifests under
examples/kubernetes/cert-manager/(HTTP-01 ClusterIssuer, DNS-01 ClusterIssuer with EAB, sample Certificate, EAB Secret template, README). Full integration guide on the wiki and on https://ucm.tools/docs.
Changed
- ACME audit & RBAC hardening. Challenge state transitions now produce audit records on terminal states (
valid/invalid) instead of every poll, eliminating audit log noise.account.key_change(RFC 8555 §7.3.5) is audited.delete:acmepermission added to theoperatorrole to matchwrite:acme. - ACME backup/restore parity.
acme_eab_credentialsis now exported and restored alongsideacme_accounts; full account fields (contact, status, terms-of-service, external-account-binding metadata) are now round-tripped end-to-end.
Fixed
backend/services/ssh_cas.py— converted f-strings containing escape sequences to raw f-strings to silence PythonSyntaxWarning: invalid escape sequenceon 3.12+.
Full history: CHANGELOG.md
Installation
Docker (Recommended)
# From Docker Hub
docker pull neyslim/ultimate-ca-manager:2.141
# Or from GitHub Container Registry
docker pull ghcr.io/neyslim/ultimate-ca-manager:2.141
# Run
docker run -d -p 8443:8443 \
-e SECRET_KEY=$(openssl rand -hex 32) \
--name ucm neyslim/ultimate-ca-manager:2.141Debian/Ubuntu
wget https://github.com/NeySlim/ultimate-ca-manager/releases/download/v2.141/ucm_2.141_all.deb
sudo dpkg -i ucm_2.141_all.deb
sudo apt-get install -fFedora/RHEL
wget https://github.com/NeySlim/ultimate-ca-manager/releases/download/v2.141/ucm-2.141-1.fc43.noarch.rpm
sudo dnf install ./ucm-2.141-1.fc43.noarch.rpmSilent/Automated Install
# Skip firewall prompts for CI/automation
sudo UCM_PORT=8443 UCM_FIREWALL=no dpkg -i ucm_2.141_all.debDefault Credentials
- Username:
admin - Password: Check
/etc/ucm/ucm.envafter install, or shown during install
Change the password immediately after first login!