github fabriziosalmi/certmate v2.56.0
v2.56.0 (ECDSA client certificates and CA, and what CertMate does with post-quantum cryptography)

one hour ago

v2.56.0 (ECDSA client certificates and CA, and what CertMate does with post-quantum cryptography)

Two features for client certificates, a first post-quantum step, and a round of fixes, most of them to the storage backends and the dashboard. The API contract goes from 2.61 to 2.65; every change is additive.

  • A client certificate can have an ECDSA or a larger RSA key (#1421, #1456). Client certificates were always RSA 2048. A create now takes key_type, key_size and elliptic_curve, the values server certificates take: RSA 2048, 3072 or 4096, ECDSA P-256 or P-384, in the API and in the create form. A request that names none gets the default set in Settings > General (client_cert_key_type, client_cert_key_size, client_cert_elliptic_curve), RSA 2048 unless changed. A renewal generates the same kind of key the certificate had; a certificate issued before this release reads it from the certificate itself. An ECDSA certificate carries digitalSignature only, without keyEncipherment, which is an RSA operation. Key options sent with a CSR are refused, not ignored. Contract 2.64.
  • The client CA can have an ECDSA key (#1421, #1457). The key is chosen when the CA is created: on first start from CERTMATE_CLIENT_CA_KEY_ALGORITHM, or with key_algorithm on POST /api/client-certs/ca/reset. The values are rsa-4096 (the default, as before), ecdsa-p256 and ecdsa-p384. An existing CA is never converted, so every certificate it signed keeps verifying. A P-384 CA signs with SHA-384. With the previous item, a whole chain can be ECDSA P-384, as EAP-TLS in WPA3-Enterprise 192-bit mode requires. Contract 2.65.
  • Post-quantum cryptography: what CertMate does today, and what it does not (#1452, #1453, #1454, #1455). Post-quantum cryptography is a new page that answers three questions apart, each with the test or the measurement behind it:
    • Key exchange. The image's OpenSSL 3.5.7 offers the hybrid group X25519MLKEM768 by default on CertMate's outbound TLS connections. Every image build now checks it inside the built image, together with a control group that must be refused, so the check can fail.
    • Certificates and signatures. These stay classical: publicly trusted certificates may only be RSA or ECDSA today.
    • Inventory. The crypto report no longer counts a key algorithm it does not recognise as quantum-safe. Such a key has quantum_vulnerable: null and is counted in quantum_vulnerability_unknown, the CSV says unknown, and the report page shows a "Not recognised" card. The deprecation notes now cite NIST IR 8547 (Final, October 2026: RSA, ECDSA and EdDSA deprecated after 2030, disallowed after 2035) in place of an EU date no source in hand stated. Contract 2.63.
    • Key check. Whether a stored key belongs to its certificate is now decided by comparing the public keys' bytes. The old check only worked for RSA, EC and DSA keys. An Ed25519 or ML-DSA pair was reported mismatched, and its certificate needed renewal although its key was the right one.
  • The Certificates page searches its own list (#1385, #1415). A search field next to the status chips narrows the table in place. It looks at what the command palette finds a certificate by: its name or address, its host, its other names, its tags and its note. It combines with the status chips and the tag filter.
  • Settings is a side menu (#1423, #1450). From 1024 px up, the twelve sections are a side menu in three groups. On a phone they are a list. There is no horizontal scroll bar at any width.
  • Fix: how urgent a certificate looks follows the renewal rule (#1429, #1443). The dashboard called a certificate expiring at 30 days left, and the bell and the inventory called it critical at 7. So every new 160-hour certificate was critical, and a 47-day certificate was expiring for 30 of its 47 days. A certificate's answer now carries expiry_status (ok, warning, critical, expired), decided by the same rule that decides when it renews, and not_before. Contract 2.62.
  • Fix: the HashiCorp Vault backend works in the published image, and Test Connection tells the truth (#1422, #1424, #1441, #1444, #1449).
    • The image now ships hvac, so Vault works without a derived image.
    • Test Connection reported success for any Vault configuration, a host that does not exist included. It now reports a backend it cannot reach as a failure, and names the requirements file when the backend's library is missing.
    • After a reload, Test Connection and Migrate use the saved token or credentials, for the address they were saved for.
    • A migration that left a certificate behind is recorded as a failure in the audit trail.
  • Fix: saving any setting no longer erases Infisical's client ID (#1444). The page did not fill it in after a reload, so the next save wrote an empty value over it. Infisical then failed at start, and storage fell back to the local disk. If you use Infisical and storage moved to the local disk, enter the client ID again.
  • Fix: an edit shows at once with a storage backend active (#1425, #1445). With a backend active, a certificate's answer was read from the backend's copy, while an edit (a probe, a note, the tags, auto-renew, the DNS provider) writes the local one. Every edit was missing from the list until the next renewal. The answer now reads the local record.
  • Fix: a certificate still issuing stays in the list until its job ends (#1426, #1446). The page stopped polling after about five minutes and removed the "Issuing" row of a job that was still running, so a failure after that was never shown. It now polls for as long as the job runs, more slowly after the first minute.
  • Fix: a failed issuance or renewal names the CA's reason first (#1442). certbot prints the CA's reason on stdout and only "Some challenges have failed." on stderr, and the message was built from stderr. The reason for each refused name now comes first.
  • Fix: the Server, Client and ACME buttons stay where they are (#1440). Changing the view re-centred the toggle, which moved the buttons under the pointer by up to 185 px. The ACME view also has counters now: Total, Valid, Revoked.
  • Accessibility: every Settings field is announced by its label (#1416). 69 controls in nine templates had no accessible name: labels not bound to their field, and buttons holding only an icon.
  • Supply chain and CI.
    • The npm that publishes the MCP server is installed from a tarball whose SHA-512 is pinned (#1409).
    • The jobs on the self-hosted runner install only packages the lock hashes (#1420).
    • The Galaxy publish job runs Python 3.13 with ansible-core 2.22.0 (#1448).
    • The weekly wiki check accepts a wiki of pointers (#1418).
    • Every Markdown link, release notes included, must open a file (#1417).
    • The notes of a release travel in its release PR, so main never names an unreleased version (#1412).
  • Dependencies:
    • Image: boto3 1.43.126, dnspython 2.9.2, SQLAlchemy 2.1.8, Authlib 1.9.5, pip 26.3 (#1439).
    • Azure Key Vault extras: 4.12.0 or later (#1413).
    • Tests and tooling: coverage 7.17.2, ruff 0.17.4, pytest-asyncio 1.4.1.post1 (#1439, #1436).
    • CSS build: nanoid 3.3.20, outside GHSA-2v37-7h3g-55p8; development only, not in the image (#1419).
    • The pinned GitHub Actions (#1414, #1434).
    • Dependabot no longer proposes Tailwind 4, which is the migration in #544 (#1447).

Don't miss a new certmate release

NewReleases is sending notifications on new releases.