pub mod ca {
use crate::{Client, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub struct Certificate {
pub name: String,
#[serde(rename = "cert-key-type")]
pub cert_key_type: String,
#[serde(rename = "ca-cert")]
pub ca_cert_pem: String,
}
pub async fn certificates(client: &Client) -> Result<Vec<Certificate>> {
let cas = client.get_json("/v1/config/strongbox/tls/ca", None).await?;
Ok(cas)
}
pub async fn certificate_roles(client: &Client, ca_name: &str) -> Result<Vec<Role>> {
let roles = client
.get_json(&format!("/v1/config/strongbox/tls/ca/{ca_name}/role"), None)
.await?;
Ok(roles)
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Role {
pub name: String,
pub ttl: std::time::Duration,
}
pub async fn create_certificate_role(
client: &Client,
ca_name: &str,
role: &Role,
) -> Result<()> {
let _put_result = client
.put_json(
&format!("/v1/config/strongbox/tls/ca/{ca_name}/role/{}", role.name),
&serde_json::to_value(role)?,
)
.await?;
Ok(())
}
}
pub mod server_certificate {
use crate::{Client, Result};
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct Certificate {
pub cert: String,
#[serde(rename = "private-key")]
pub private_key: String,
pub serial: String,
pub expires: chrono::DateTime<chrono::offset::FixedOffset>,
}
pub async fn create_certificate(
client: &Client,
ca_name: &str,
role_name: &str,
ttl: std::time::Duration,
host: &str,
alt_name: &str,
) -> Result<Certificate> {
let req = serde_json::json!({
"ttl": ttl,
"host": host,
"cert-type": "server",
"alt-name": alt_name,
});
let cert = client
.post_json(
&format!("/v1/state/strongbox/tls/ca/{ca_name}/role/{role_name}/issue-cert",),
&req,
)
.await?;
let cert = serde_json::from_value(cert)?;
Ok(cert)
}
}