use serde::Deserialize;
use super::empty_string_is_no_values;
#[derive(Debug, Clone, Deserialize)]
#[serde(default)]
pub struct SignerConfig {
pub backend: String,
pub local_ca: LocalCaConfig,
pub relay: RelayConfig,
pub custom: CustomSignerConfig,
}
impl Default for SignerConfig {
fn default() -> Self {
Self {
backend: "local_ca".to_string(),
local_ca: LocalCaConfig::default(),
relay: RelayConfig::default(),
custom: CustomSignerConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(default)]
pub struct CustomSignerConfig {
pub script_path: String,
pub timeout_ms: u64,
#[serde(deserialize_with = "empty_string_is_no_values")]
pub args: Vec<String>,
pub supports_crl: bool,
pub supports_renewal_info: bool,
}
impl Default for CustomSignerConfig {
fn default() -> Self {
Self {
script_path: String::new(),
timeout_ms: 5000,
args: Vec::new(),
supports_crl: false,
supports_renewal_info: false,
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(default)]
pub struct RelayConfig {
pub directory_url: String,
pub account_key_path: String,
#[serde(deserialize_with = "empty_string_is_no_values")]
pub contact: Vec<String>,
pub challenge_strategy: String,
pub poll_interval_ms: u64,
pub poll_timeout_secs: u64,
pub dns01: Dns01Config,
pub eab: RelayEabConfig,
}
impl Default for RelayConfig {
fn default() -> Self {
Self {
directory_url: String::new(),
account_key_path: "upstream_account.key".to_string(),
contact: Vec::new(),
challenge_strategy: "bypass".to_string(),
poll_interval_ms: 2000,
poll_timeout_secs: 300,
dns01: Dns01Config::default(),
eab: RelayEabConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct RelayEabConfig {
pub kid: String,
pub hmac_key: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(default)]
pub struct Dns01Config {
pub provider: String,
pub rfc2136: Rfc2136Config,
}
impl Default for Dns01Config {
fn default() -> Self {
Self {
provider: "rfc2136".to_string(),
rfc2136: Rfc2136Config::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct Rfc2136Config {
pub server: String,
pub zone: String,
pub tsig_key_name: String,
pub tsig_key_secret: String,
pub tsig_algorithm: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(default)]
pub struct LocalCaConfig {
pub cert_path: String,
pub key_path: String,
pub key_type: String,
pub leaf_validity_days: u64,
pub crl_path: String,
#[serde(deserialize_with = "empty_string_is_no_values")]
pub crl_distribution_points: Vec<String>,
#[serde(deserialize_with = "empty_string_is_no_values")]
pub ca_issuer_urls: Vec<String>,
pub subject: LocalCaSubjectConfig,
pub key_source: String,
pub pkcs11: Pkcs11Config,
}
impl Default for LocalCaConfig {
fn default() -> Self {
Self {
cert_path: "ca.pem".to_string(),
key_path: "ca.key".to_string(),
key_type: "ecdsa-p256".to_string(),
leaf_validity_days: 90,
crl_path: "ca.crl".to_string(),
crl_distribution_points: Vec::new(),
ca_issuer_urls: Vec::new(),
subject: LocalCaSubjectConfig::default(),
key_source: "file".to_string(),
pkcs11: Pkcs11Config::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct Pkcs11Config {
pub module_path: String,
pub token_label: String,
pub slot_id: Option<u64>,
pub key_label: String,
pub key_id: String,
pub pin: String,
pub pin_file: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct LocalCaSubjectConfig {
pub common_name: Option<String>,
pub organization: Option<String>,
pub organizational_unit: Option<String>,
pub country: Option<String>,
pub state: Option<String>,
pub locality: Option<String>,
}