(&self, domain: &str, config: &ZtDomainConfig)
| 180 | } |
| 181 | |
| 182 | async fn do_request_new(&self, domain: &str, config: &ZtDomainConfig) -> Result<()> { |
| 183 | let acme_client = self.get_or_create_acme_client(domain, config).await?; |
| 184 | |
| 185 | // Generate new key pair (always use new key for security) |
| 186 | let key = KeyPair::generate().context("failed to generate key")?; |
| 187 | let key_pem = key.serialize_pem(); |
| 188 | let public_key_der = key.public_key_der(); |
| 189 | |
| 190 | // Request wildcard certificate (domain in config is base domain, cert is *.domain) |
| 191 | let wildcard_domain = format!("*.{}", domain); |
| 192 | info!( |
| 193 | "requesting new certificate from ACME for {}...", |
| 194 | wildcard_domain |
| 195 | ); |
| 196 | let cert_pem = tokio::time::timeout( |
| 197 | self.config().renew_timeout, |
| 198 | acme_client.request_new_certificate(&key_pem, &[wildcard_domain]), |
| 199 | ) |
| 200 | .await |
| 201 | .context("certificate request timed out")? |
| 202 | .context("failed to request new certificate")?; |
| 203 | |
| 204 | let not_after = get_cert_expiry(&cert_pem).context("failed to parse certificate expiry")?; |
| 205 | |
| 206 | // Save certificate to KvStore |
| 207 | self.save_cert_to_kvstore(domain, &cert_pem, &key_pem, not_after)?; |
| 208 | info!("new certificate obtained from ACME, saved to KvStore"); |
| 209 | |
| 210 | // Generate and save attestation |
| 211 | self.generate_and_save_attestation(domain, &public_key_der) |
| 212 | .await?; |
| 213 | |
| 214 | // Load into memory cert store |
| 215 | let cert_data = CertData { |
| 216 | cert_pem, |
| 217 | key_pem, |
| 218 | not_after, |
| 219 | issued_by: self.kv_store.my_node_id(), |
| 220 | issued_at: now_secs(), |
| 221 | }; |
| 222 | self.cert_resolver.update_cert(domain, &cert_data)?; |
| 223 | |
| 224 | info!( |
| 225 | "new certificate loaded (expires in {} days)", |
| 226 | (not_after - now_secs()) / 86400 |
| 227 | ); |
| 228 | Ok(()) |
| 229 | } |
| 230 | |
| 231 | async fn do_renew(&self, domain: &str, config: &ZtDomainConfig) -> Result<bool> { |
| 232 | let acme_client = self.get_or_create_acme_client(domain, config).await?; |
no test coverage detected