Add support for domain checks. #11
1 changed files with 23 additions and 0 deletions
|
@ -70,6 +70,9 @@ impl CertStore {
|
|||
loop {
|
||||
let mut domains: HashSet<String> = HashSet::new();
|
||||
|
||||
// Collect domains that need a TLS certificate
|
||||
// either from the proxy configuration (eagerly)
|
||||
// or on reaction to a user request (lazily)
|
||||
select! {
|
||||
res = rx_proxy_config.changed() => {
|
||||
if res.is_err() {
|
||||
|
@ -78,6 +81,8 @@ impl CertStore {
|
|||
|
||||
let proxy_config: Arc<ProxyConfig> = rx_proxy_config.borrow().clone();
|
||||
for ent in proxy_config.entries.iter() {
|
||||
// Eagerly generate certificates for domains that
|
||||
// are not patterns
|
||||
if let HostDescription::Hostname(domain) = &ent.url_prefix.host {
|
||||
if let Some((host, _port)) = domain.split_once(':') {
|
||||
domains.insert(host.to_string());
|
||||
|
@ -85,6 +90,9 @@ impl CertStore {
|
|||
domains.insert(domain.clone());
|
||||
}
|
||||
}
|
||||
|
||||
// @TODO Register a map of
|
||||
// UrlPrefix -> OnDemandTlsAskCheckUrl
|
||||
}
|
||||
}
|
||||
need_cert = rx_need_cert.recv() => {
|
||||
|
@ -100,12 +108,17 @@ impl CertStore {
|
|||
}
|
||||
}
|
||||
|
||||
// Now that we have our list of domains to check,
|
||||
// actually do something
|
||||
for dom in domains.iter() {
|
||||
// Exclude from the list domains that were checked less than 60
|
||||
// seconds ago
|
||||
match t_last_check.get(dom) {
|
||||
Some(t) if Instant::now() - *t < Duration::from_secs(60) => continue,
|
||||
_ => t_last_check.insert(dom.to_string(), Instant::now()),
|
||||
};
|
||||
|
||||
// Actual Let's Encrypt calls are done here (in sister function)
|
||||
debug!("Checking cert for domain: {}", dom);
|
||||
if let Err(e) = self.check_cert(dom).await {
|
||||
warn!("({}) Could not get certificate: {}", dom, e);
|
||||
|
@ -186,6 +199,15 @@ impl CertStore {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
/// Check certificate ensure that the certificate is in the memory store
|
||||
/// and that it does not need to be renewed.
|
||||
///
|
||||
/// If it's not in the memory store, it tries to load it from Consul,
|
||||
/// if it's not in Consul, it calls Let's Encrypt.
|
||||
///
|
||||
/// If the certificate is outdated in the memory store, it tries to load
|
||||
/// a more recent version in Consul, if the Consul version is also outdated,
|
||||
/// it tries to renew it
|
||||
pub async fn check_cert(self: &Arc<Self>, domain: &str) -> Result<()> {
|
||||
// First, try locally.
|
||||
{
|
||||
|
@ -226,6 +248,7 @@ impl CertStore {
|
|||
self.renew_cert(domain).await
|
||||
}
|
||||
|
||||
/// This is the place where certificates are generated or renewed
|
||||
pub async fn renew_cert(self: &Arc<Self>, domain: &str) -> Result<()> {
|
||||
info!("({}) Renewing certificate", domain);
|
||||
|
||||
|
|
Loading…
Reference in a new issue
Je pense que le délai peut être abaissé à 100ms, voir complètement supprimé, en tout cas dans un cas où c'est Garage le backend
J'aime bien quand même l'idée de garder un délai, ça nous évitera de DoS un truc si un bot venait à spam d'une manière imprévue tricot. Je préfère que la partie control plane de tricot soit ralentie que on propage la charge en arrière. Meme si je reconnais que c'est quand meme bien primitif comme méthode de controle. Hmm, du coup 100ms ça me parait être un bon compromis.
Mon hypothèse c'était que même si on se prend un DoS, vu que les requêtes vers le back-end garage sont pas faites en parallèle mais l'une après l'autre, même sans délai ça fera jamais tomber garage en fait, c'est rien du tout par rapport à ce qu'il peut gérer. Du coup la proposition d'enlever le délai ça permettait juste de pas avoir un délai dans le happy path qui serait pas particulièrement utile ^^ Après 100ms de délai c'est vraiment pas grand chose donc ça me va aussi de le laisser