Fix ACME: Update defaultCertificateId when renewing a certificate that is currently set as default

This commit is contained in:
Maurus Decimus
2026-05-19 17:00:18 +02:00
parent 190eecb7ee
commit 146ab3d39c
2 changed files with 41 additions and 1 deletions

View File

@@ -17,7 +17,7 @@ use registry::{
prelude::ObjectType,
structs::{
AcmeProvider, Certificate, CertificateManagement, DnsManagement, Domain, PublicText,
PublicTextValue, SecretText, SecretTextValue, Task, TaskDnsManagement,
PublicTextValue, SecretText, SecretTextValue, SystemSettings, Task, TaskDnsManagement,
TaskDomainManagement, TaskStatus,
},
},
@@ -91,6 +91,8 @@ impl Server {
)
.await?;
let parsed_cert = ParsedCert::parse(&pem_cert.certificate)?;
let mut new_sans = parsed_cert.sans.clone();
new_sans.sort();
let certificate = Certificate {
private_key: SecretText::Text(SecretTextValue {
secret: pem_cert.private_key,
@@ -118,6 +120,43 @@ impl Server {
.await?
{
RegistryWriteResult::Success(id) => {
// Repoint the default certificate to the renewed object when it
// tracks the same SAN set, so its id does not go stale
if let Some(old) = self
.registry()
.get(ObjectType::SystemSettings.singleton())
.await?
{
let mut settings = SystemSettings::from(old.clone());
if let Some(default_id) = settings.default_certificate_id
&& let Some(default_cert) =
self.registry().object::<Certificate>(default_id).await?
{
let mut default_sans =
default_cert.subject_alternative_names.clone().into_inner();
default_sans.sort();
if default_sans == new_sans {
settings.default_certificate_id = Some(id);
if let Err(err) = self
.registry()
.write(RegistryWrite::update(
Id::singleton(),
&settings.into(),
&old,
))
.await
{
trc::error!(
err.details(
"Failed to update default certificate after ACME renewal."
)
.caused_by(trc::location!())
);
}
}
}
}
// Reload registry
let change = RegistryChange::Insert(ObjectId::new(ObjectType::Certificate, id));
Box::pin(self.reload_registry(change)).await?;