2.0 KiB
2.0 KiB
id, name, status, depends_on, scope, risk, impact, level
| id | name | status | depends_on | scope | risk | impact | level | |
|---|---|---|---|---|---|---|---|---|
| transport/acme-cert-provisioning | Implement ACME Lets Encrypt certificate provisioning (feature-gated acme) | pending |
|
moderate | high | component | implementation |
Description
Implement automatic TLS certificate provisioning via ACME (Let's Encrypt). Two modes per ADR-008:
- Domain-based ACME (
--acme-domain): Standard flow with HTTP-01 or TLS-ALPN-01 challenges. Domain-bound, auto-renewing. - IP-based ACME: Short-lived certs via TLS-ALPN-01 on port 443. No domain needed.
Uses rustls-acme (pure Rust) to avoid external certbot dependency. Feature-gated behind acme (implies tls).
This integrates with TlsAcceptor by providing ACME-resolved certificates instead of manual cert/key files.
Acceptance Criteria
crates/wraith-core/src/transport/acme.rs(behind#[cfg(feature = "acme")])- Feature
acmeimpliestlsin Cargo.toml AcmeCertProviderstruct accepts: domain (domain-based) or IP mode flag- Domain-based mode: uses
rustls-acmewith HTTP-01/TLS-ALPN-01 challenge responder - IP-based mode: uses
rustls-acmewith TLS-ALPN-01 on port 443 AcmeCertProviderproduces arustls::ServerConfigthatTlsAcceptorcan use- Certificate auto-renewal handled by
rustls-acmebackground task TlsAcceptorupdated to accept either manual certs OR anAcmeCertProvider- Integration with
TlsAcceptor::bind_acme()or similar constructor - Unit tests for ACME config construction (challenge responder setup)
- Integration test: ACME cert provisioning with Let's Encrypt staging (marked
#[ignore]for CI)
References
- docs/architecture/server.md — TLS certificate provisioning modes
- docs/architecture/decisions/008-acme-lets-encrypt.md — ACME design, rustls-acme choice
- docs/architecture/transport.md — feature flags, TLS transport constraints
Notes
To be filled by implementation agent
Summary
To be filled on completion