Commit Graph
22 Commits
Author SHA1 Message Date
Roman KivalinandClaude Opus 4.6 252c2967fd Bump version to 0.6.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 01:24:31 +02:00
Roman KivalinandClaude Opus 4.6 f63af47487 Fix wildcard DNS-01 challenges
Per RFC 8555 §8.4, the DNS-01 challenge for *.example.com uses
_acme-challenge.example.com (strip the *. prefix), not the invalid
_acme-challenge.*.example.com.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.5.0
2026-04-13 23:40:39 +02:00
Roman KivalinandClaude Opus 4.6 96f98352a8 Don't bind systemd-creds to a specific credential name
Omit --name= from systemd-creds encrypt so the encrypted credential
can be loaded under any name via LoadCredentialEncrypted=. Previously,
the embedded name had to match the credential name in the service
unit, causing decryption failures when services used different names.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 23:29:26 +02:00
Roman KivalinandClaude Opus 4.6 37f6e4d443 Support multiple zones per DNS client with automatic zone matching
DNS clients now accept both `zone` (single) and `zones` (list).
Zone matching uses longest suffix: `mail.example.com` matches
`example.com`, and `host.sub.example.com` prefers `sub.example.com`
over `example.com`.

Config validation checks that every certificate domain (via its DNS-01
solver) and every DANE name matches at least one zone in the
referenced DNS client.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 23:14:54 +02:00
Roman KivalinandClaude Opus 4.6 3674a222a6 Bump version to 0.5.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:17:03 +02:00
Roman KivalinandClaude Opus 4.6 4ecd500a96 Fix PKGBUILD: build from local repo, options=(!lto) for Arch compat
Arch's makepkg LTO interferes with ring's asm objects. The standard
Arch workaround is options=(!lto) in the PKGBUILD. Also:
- Add backup= to CI release PKGBUILD for consistency
- Add /pkg/ and *.pkg.tar.zst to .gitignore
- Consolidate PKGBUILD changelog entries

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.4.0
2026-04-13 22:04:33 +02:00
Roman KivalinandClaude Opus 4.6 f36b2f8559 Add ACME profile support for IP address certificates
- New per-certificate `profile` field for ACME profile selection
- Let's Encrypt requires "shortlived" for IP address certs (~6 day validity)
- Profile documented in README with link to LE profiles page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:59:04 +02:00
Roman KivalinandClaude Opus 4.6 0726e829a9 Add HMAC-SHA-384 TSIG support, document HMAC-SHA-512 truncation limitation
BIND 9.18+ truncates HMAC-SHA-512 MACs by default, and hickory-dns
does not support verifying truncated HMACs. Document the workaround
(use hmac-sha256) and add hmac-sha384 as an additional option.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:35:12 +02:00
Roman KivalinandClaude Opus 4.6 25722231e0 Update README for new config format and challenge solvers
Document named DNS clients, solver configuration (DNS-01, HTTP-01,
TLS-ALPN-01), per-domain solver assignment, and IP address certificates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:48:01 +02:00
Roman KivalinandClaude Opus 4.6 47fdf010f9 Add HTTP-01 and TLS-ALPN-01 challenge solvers
HTTP-01 solver with two modes:
- Standalone: embedded hyper HTTP server on configurable address
- Webroot: writes token files for an existing web server

TLS-ALPN-01 solver:
- Embedded rustls TLS server with ALPN "acme-tls/1"
- Dynamic certificate resolution per-identifier
- Self-signed cert with critical acmeIdentifier extension (RFC 8737)

Both solvers use rustls/ring crypto backend (no aws-lc-rs dependency).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:40:57 +02:00
Roman KivalinandClaude Opus 4.6 f990494242 Add solver trait and refactor renewal to use it
- Solver trait with present/cleanup/needs_propagation_delay methods
- DNS-01 solver extracted from inline renew.rs code
- ACME module now supports mixed Identifier::Dns + Identifier::Ip
- Generic ChallengeInfo replaces DnsChallenge
- Per-domain challenge type selection based on solver config
- Propagation delay only applied when DNS-01 solvers are in use
- Solver instances deduplicated by name across domains

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:34:50 +02:00
Roman KivalinandClaude Opus 4.6 da8c937782 Refactor config: named DNS clients, challenge solvers, per-domain solver assignment
Breaking config change. The DNS and challenge configuration is now
structured around named, reusable components:

- [dns.*] named DNS client connections with explicit zone field
- [solver.*] challenge solvers (dns-01, http-01, tls-alpn-01)
- Certificates reference solvers by name (solver/solvers fields)
- DANE blocks reference DNS clients by name (dns field)
- Removed automatic zone detection heuristics
- Added default_solver for global fallback
- Validation: DNS-01 rejected for IP addresses, solver/solvers
  mutual exclusivity, length matching, reference integrity

HTTP-01 and TLS-ALPN-01 solver implementations to follow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:15:01 +02:00
Roman KivalinandClaude Opus 4.6 40d7240ef9 Bump version to 0.4.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:54:40 +02:00
Roman KivalinandClaude Opus 4.6 af8cdd3e41 Add DNS propagation delay before ACME challenge validation
Wait 5 seconds after publishing DNS-01 TXT records before notifying
the ACME server, giving the DNS server time to propagate the update.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.3.0
2026-04-12 23:31:59 +02:00
Roman KivalinandClaude Opus 4.6 8ed22ca1d5 Bump version to 0.3.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:29:36 +02:00
Roman KivalinandClaude Opus 4.6 08cacff569 Build release binaries on Ubuntu 22.04 for glibc 2.35 compat
Debian 12 (bookworm) ships glibc 2.36. The previous ubuntu-latest
(24.04) produced binaries requiring glibc 2.39.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.2.0
2026-04-12 22:43:35 +02:00
Roman KivalinandClaude Opus 4.6 1c5aa8b930 Bump version to 0.2.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:52:07 +02:00
Roman KivalinandClaude Opus 4.6 7161fe2fb6 Fix release workflow and drop aws-lc-rs dependency
- Use ring backend for instant-acme instead of aws-lc-rs (fixes Arch
  build linker errors, also reduces binary from 9MB to 6.6MB)
- Remove redundant mv in deb packaging (dpkg-deb already outputs the
  correct filename)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.1.0
2026-04-12 21:44:12 +02:00
Roman KivalinandClaude Opus 4.6 000ec410b1 Add README and CHANGELOG
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:07:20 +02:00
Roman KivalinandClaude Opus 4.6 1c517ecbab Add packaging, CI, and license
- MIT license
- Arch Linux PKGBUILD
- Debian packaging (debian/)
- GitHub Actions: CI (test + clippy) and release workflow
  builds x86_64 + aarch64 binaries, Arch and Debian packages
- Default config is now no-op (certificate blocks commented out)
- Fix clippy warnings (collapsible ifs, redundant closures)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:47:00 +02:00
Roman KivalinandClaude Opus 4.6 32697369cf Optimize release binary size (16MB → 9MB)
Enable LTO, single codegen unit, symbol stripping, and panic=abort
in the release profile. Trim tokio features to only what's needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:12:06 +02:00
Roman KivalinandClaude Opus 4.6 c1fdfba3fe Initial implementation of certforge ACME certificate manager
Rust CLI tool for automated ACME certificate management with:
- DNS-01 challenge via RFC 2136 dynamic DNS updates with TSIG auth
- DANE TLSA record publication (RFC 6698/7671/7672)
- systemd credential integration (systemd-creds encrypt/decrypt)
- systemd unit management via D-Bus (zbus)
- Post-renewal hooks (systemctl reload/restart, arbitrary commands)
- Key rotation with DANE pre-publication protocol
- TOML configuration with per-zone DNS overrides

Tested against Let's Encrypt staging. 12 unit tests, zero warnings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:07:27 +02:00