📜 Recent release history (last 2 versions)
[2.190] - 2026-07-10
Fixed
- API-key creation rejected valid permission resources — the permission validator in
POST /api/v2/account/apikeysused a hardcoded resource list that had drifted from the scopes actually enforced by the API: keys could not be scoped tocsrs,user_certificates,templates,truststore,est,hsm,ssh,policies,approvals,key_recovery,audit,groupsorsso(e.g.write:csrs, required to sign a CSR, was rejected — leaving CSR signing reachable only with a full-access*key). The valid set is now derived fromROLE_PERMISSIONSplus the admin-only resources (users,system,sso), with a regression test that scans every@require_authscope so the validator can no longer drift. Contributed by @heidrickla (#178).
[2.189] - 2026-07-09
Added
- ACME LOT A — shared DNS self-check for proxy and renewal — the ACME proxy and auto-renewal paths no longer use a blind fixed 30s sleep after publishing the DNS-01 TXT record. Both now poll actively via
services/acme/dns_selfcheck.py, honouringacme.client.dns_propagation_timeout(same setting as the ACME client auto-poll). If the TXT is still missing when the timeout elapses, the proxy skips upstream challenge submission and marks the challengedns_not_readyinstead of burning the token on the upstream CA. Renewal cleans up DNS TXT records on propagation or finalization failure. - ACME renewal partial TXT cleanup — multi-domain renewals now mark DNS TXT records for cleanup as soon as the first
create_txt_recordsucceeds, so a failure on a later domain no longer leaves earlier TXT records behind. - GUI toggle: verbose ACME/DNS diagnostics — ACME → Let's Encrypt → Verbose ACME/DNS logs (
acme.client.debug_logging) promotes DNS resolver diagnostics (poll ticks, per-resolver failures, lookup source) from DEBUG to INFO for troubleshooting propagation issues without raising the global log level. The flag is memoized per app context, so hot poll loops do not query the database per log line. Default off.
Changed
- ACME client DNS self-check refactor —
_dns_selfcheck/ timeout reading inorders.pynow delegate to the shareddns_selfcheckmodule used by proxy and renewal, keeping one implementation for poll interval, logging, and timeout semantics.
Fixed
- AD CS Kerberos authentication crashed on a missing unused dependency — the kerberos auth mode built the certsrv client in NTLM mode before attaching the Kerberos handler, which made the certsrv library import
requests_ntlmeven though it was never used. Every Test Connection / sign in kerberos mode failed with "No module named 'requests_ntlm'". The client is now built with a neutral placeholder auth and the Kerberos handler attached directly; all three auth modes (basic, certificate/mTLS, kerberos) smoke-tested end-to-end against a Windows Server 2025 AD CS.
Full history: CHANGELOG.md
Installation
Docker (Recommended)
# From Docker Hub
docker pull neyslim/ultimate-ca-manager:2.191-rc1
# Or from GitHub Container Registry
docker pull ghcr.io/neyslim/ultimate-ca-manager:2.191-rc1
# Run
docker run -d -p 8443:8443 \
-e SECRET_KEY=$(openssl rand -hex 32) \
--name ucm neyslim/ultimate-ca-manager:2.191-rc1Debian/Ubuntu
wget https://github.com/NeySlim/ultimate-ca-manager/releases/download/v2.191-rc1/ucm_2.191.rc1_all.deb
sudo dpkg -i ucm_2.191.rc1_all.deb
sudo apt-get install -fFedora/RHEL
wget https://github.com/NeySlim/ultimate-ca-manager/releases/download/v2.191-rc1/ucm-2.191.rc1-1.fc43.noarch.rpm
sudo dnf install ./ucm-2.191.rc1-1.fc43.noarch.rpmSilent/Automated Install
# Skip firewall prompts for CI/automation
sudo UCM_PORT=8443 UCM_FIREWALL=no dpkg -i ucm_2.191.rc1_all.debDefault Credentials
- Username:
admin - Password:
changeme123
Change the password immediately after first login!
Documentation
- Installation Guide
- API Documentation