Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 1 addition & 3 deletions ct_monitor/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ license.workspace = true
[dependencies]
anyhow.workspace = true
clap = { workspace = true, features = ["derive"] }
hex = { workspace = true, features = ["alloc", "std"] }
hex_fmt.workspace = true
regex.workspace = true
reqwest = { workspace = true, default-features = false, features = ["json", "rustls-tls", "charset", "hickory-dns"] }
Expand All @@ -21,6 +22,3 @@ tokio = { workspace = true, features = ["full"] }
tracing.workspace = true
tracing-subscriber.workspace = true
x509-parser.workspace = true

dstack-gateway-rpc.workspace = true
ra-rpc = { workspace = true, default-features = false, features = ["client"] }
47 changes: 39 additions & 8 deletions ct_monitor/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

use anyhow::{bail, Context, Result};
use clap::Parser;
use dstack_gateway_rpc::gateway_client::GatewayClient;
use ra_rpc::client::RaClient;
use regex::Regex;
use serde::{Deserialize, Serialize};
use std::collections::BTreeSet;
Expand All @@ -15,6 +13,13 @@

const BASE_URL: &str = "https://crt.sh";

#[derive(Debug, Deserialize)]
struct AcmeInfoResponse {
#[allow(dead_code)]
account_uri: String,
hist_keys: Vec<String>,
}

struct Monitor {
gateway_uri: String,
domain: String,
Expand Down Expand Up @@ -48,12 +53,38 @@
}

async fn refresh_known_keys(&mut self) -> Result<()> {
info!("fetching known public keys from {}", self.gateway_uri);
// TODO: Use RA-TLS
let tls_no_check = true;
let rpc = GatewayClient::new(RaClient::new(self.gateway_uri.clone(), tls_no_check)?);
let info = rpc.acme_info().await?;
self.known_keys = info.hist_keys.into_iter().collect();
let acme_info_url = format!("{}/acme-info", self.gateway_uri.trim_end_matches('/'));
info!("fetching known public keys from {}", acme_info_url);

let client = reqwest::Client::builder()
.danger_accept_invalid_certs(true) // TODO: Use RA-TLS verification
Comment thread Fixed
.build()
.context("failed to build http client")?;

let response = client
.get(&acme_info_url)
.send()
.await
.context("failed to fetch acme-info")?;

if !response.status().is_success() {
bail!(
"failed to fetch acme-info: HTTP {}",
response.status().as_u16()
);
}

let info: AcmeInfoResponse = response
.json()
.await
.context("failed to parse acme-info response")?;

self.known_keys = info
.hist_keys
.into_iter()
.map(|hex_key| hex::decode(&hex_key).context("invalid hex in hist_keys"))
.collect::<Result<BTreeSet<_>>>()?;

info!("got {} known public keys", self.known_keys.len());
for key in self.known_keys.iter() {
debug!(" {}", hex_fmt::HexFmt(key));
Expand Down