v2.226-rc1
Pre-release
Pre-release
馃摐 Recent release history (last 2 versions)
[2.225] - 2026-09-09
Added
- A CSR generated in UCM can be completed by a certificate issued elsewhere. The workflow for a public or third-party CA (generate the CSR in UCM, download it, have it signed, import the certificate) ended with a certificate record that had no private key: the import matched existing records on subject and issuer, which a CSR record never has, so the certificate was stored as a separate keyless entry and could not be exported with its key. The import (Certificates page and Smart Import) now recognises a certificate whose public key is that of a pending CSR, completes that CSR record and keeps its private key, so the certificate exports with the key like any other; the match is made on the key pair, so it holds when the CA rewrites the subject. A key that arrives alongside the certificate is attached when the CSR was uploaded without one. The CSR page also gained Download Private Key on a pending CSR that holds its key (
GET /api/v2/csrs/<id>/export?format=key, or POST with apasswordfor encrypted PKCS#8), gated like every direct key export by the admin-onlyread:private_keyspermission and recorded in the audit log (#341, reported by @kiar1404-de)
Fixed
- A certificate issued from a CSR generated in UCM no longer appears as "CSR for " in the certificates list. The generator described the request that way and signing kept the description, which the list shows as the certificate's name. A generated CSR is now described by its CN, and signing or completing a CSR created before this release drops the old prefix (#342, reported by @kiar1404-de)
[2.224] - 2026-09-08
Added
UCM_TRUSTED_PROXIESaccepts CIDR networks, not only exact IP addresses. Behind an ingress controller or another proxy whose source address is not fixed, every allowed peer had to be listed individually; an entry such as10.42.0.0/16now trusts any peer inside that range, and a peer that arrives as an IPv4-mapped IPv6 address (::ffff:10.42.0.5, as a dual-stack listener reports IPv4 clients) is matched against IPv4 entries and networks as well. An entry that is neither a valid address nor a valid network is ignored with a warning in the log instead of being kept as a literal string that can never match, so a typo cannot silently narrow the trusted set. The Helm chart gainedproxy.behindProxy(setsUCM_BEHIND_PROXY) andproxy.trustedProxies(setsUCM_TRUSTED_PROXIES), neither of which it templated before, so a chart deployment behind an Ingress can honourX-Forwarded-*and proxy-injected client-certificate headers without a hand-writtenextraEnventry (discussion #337, requested by @szechyjs, contributed by @Hemsby)- The certificate template editor can build a Windows smartcard logon template. The Extended Key Usage list gained
msSmartcardLogin(Microsoft Smartcard Logon, 1.3.6.1.4.1.311.20.2.2) and the SAN types gainedupn, both of which the template API and the issuance path already accepted but which the editor's fixed checkbox lists did not offer, so a reusable Smartcard Logon profile could not be clicked together even though the Issue Certificate form could produce one. A built-in Smartcard Logon system template ships alongside the others (clientAuth+msSmartcardLogin, UPN SAN). The SAN type checkboxes now use the same localized labels as the issue form rather than a bare upper-cased token (discussion #336, requested by @szechyjs, contributed by @Hemsby)
Fixed
- With
UCM_BEHIND_PROXY=1,X-Forwarded-*andX-Real-IPheaders are now honoured only when the request's immediate peer is inUCM_TRUSTED_PROXIES; from any other peer they are dropped before the proxy handling runs, with a warning in the log naming the peer. Previously enabling proxy support trusted those headers from every peer, so a client able to reach the backend directly, such as another pod in the same cluster, could choose its apparent IP, rotate past the per-IP rate limits and pollute the audit trail. Upgrade note: a reverse proxy running on another host must be listed inUCM_TRUSTED_PROXIES(IP or CIDR network), as the documentation already required; unset, the variable trusts loopback only, and a proxy that is not listed now sees its own address logged and rate-limited instead of its clients' (discussion #337, follow-up to #339) - Helm chart:
appVersionnow tracks the release the chart ships with. It had stayed at 2.170 while the image tag defaults toappVersion, so a chart install without an explicitimage.tagdeployed that old version - The public port of the admin and protocol URLs can now differ from the port UCM listens on. Settings > General accepted
http://pki.example.com:80as Protocol Base URL but dropped the:80as a default port when saving, then applied the HTTP protocol port (8080 by default, and the field refuses a port below 1024) to every CDP, OCSP and AIA URL it advertised, so a reverse proxy publishing those endpoints on port 80 could not be described; the same happened tohttps://admin.example.com:443and the HTTPS listen port for the admin canonical URL. An explicitly typed port is now kept as typed and honoured in the advertised URLs, while a URL without a port keeps taking the listen port as before (discussion #337, reported by @szechyjs) - ACME: a reused authorization now records the challenge that was performed, at the time it was performed. When an order reused a valid authorization of the same account, the built-in server created the new authorization with all three challenge types (
dns-01,http-01,tls-alpn-01) marked valid and dated to the reuse, so a renewal appeared validated by methods that were never attempted, on an instance with no DNS provider. The reused authorization now carries only the challenge(s) the client completed, with their originalvalidatedtimestamp; its expiry stays that of the original validation, since reuse does not extend a proof of control. The Orders tab of an ACME account derived an order's method from the first challenge row, which is alwaysdns-01, and so reported DNS-01 for the renewal and for a rejected order alike; it now names the validated challenge(s), the challenge the client attempted when validation failed, and N/A for an order whose challenges were never answered; on a multi-identifier order the choice is made per identifier and merged, so a name proved by dns-01 next to one that failed http-01 lists both. Authorizations reused before this fix keep the three validated rows they were given and are listed with all three methods (#338, reported by @JoseGoncalves)
Full history: CHANGELOG.md
Installation
Docker (Recommended)
# From Docker Hub
docker pull neyslim/ultimate-ca-manager:2.226-rc1
# Or from GitHub Container Registry
docker pull ghcr.io/neyslim/ultimate-ca-manager:2.226-rc1
# Run
docker run -d -p 8443:8443 \
-e SECRET_KEY=$(openssl rand -hex 32) \
--name ucm neyslim/ultimate-ca-manager:2.226-rc1Debian/Ubuntu
wget https://github.com/NeySlim/ultimate-ca-manager/releases/download/v2.226-rc1/ucm_2.226.rc1_all.deb
sudo dpkg -i ucm_2.226.rc1_all.deb
sudo apt-get install -fFedora/RHEL
wget https://github.com/NeySlim/ultimate-ca-manager/releases/download/v2.226-rc1/ucm-2.226.rc1-1.fc43.noarch.rpm
sudo dnf install ./ucm-2.226.rc1-1.fc43.noarch.rpmSilent/Automated Install
# Skip firewall prompts for CI/automation
sudo UCM_PORT=8443 UCM_FIREWALL=no dpkg -i ucm_2.226.rc1_all.debDefault Credentials
- Username:
admin - Password:
changeme123
Change the password immediately after first login!