Files
peazyrsa/src/certs.rs
2024-10-23 15:31:52 +03:00

61 lines
1.5 KiB
Rust

use anyhow::{anyhow, Result};
use std::{path::PathBuf, sync::Arc};
use crate::common::AppConfig;
use crate::crypto_provider::ICryptoProvider;
use crate::openssl::internal::OpenSSLInternalProvider;
pub(crate) struct Certs<T>
where
T: ICryptoProvider,
{
pub(crate) key_file: PathBuf,
pub(crate) cert_file: PathBuf,
pub(crate) provider: Arc<T>,
}
impl<T> Certs<T>
where
T: ICryptoProvider,
{
pub(crate) fn new(cfg: &AppConfig, provider: T) -> Self {
let base_dir = PathBuf::from(&cfg.base_directory);
let keys_dir = base_dir.clone().join(cfg.keys_subdir.clone());
let name = cfg.name.clone();
Certs {
key_file: keys_dir.join(format!("{}.key", &name)),
cert_file: keys_dir.join(format!("{}.crt", &name)),
provider: Arc::new(provider),
}
}
pub(crate) async fn request(&self) -> Result<()> {
self.provider.request().await
}
pub(crate) async fn sign(&self) -> Result<()> {
self.provider.sign().await
}
}
pub async fn build_cert(config: &AppConfig) -> Result<()> {
let certs = Certs::new(config, OpenSSLInternalProvider::from_cfg(config));
certs.request().await?;
certs.sign().await?;
let key_file = certs
.key_file
.to_str()
.ok_or(anyhow!("key_file PathBuf to str convert error"))?;
let cert_file = certs
.cert_file
.to_str()
.ok_or(anyhow!("req_file PathBuf to str convert error"))?;
println!("created: \n key: {key_file},\n cert: {cert_file}");
Ok(())
}