use openssl::hash::MessageDigest;
use openssl::pkey::PKey;
use openssl::rsa::Rsa;
use openssl::x509::{X509Builder, X509NameBuilder, X509};
use crate::error::KeyToolError;
pub fn generate_fake_cert(
alias: &str,
) -> Result<(X509, PKey<openssl::pkey::Private>), KeyToolError> {
let rsa = Rsa::generate(2048)?; let pkey = PKey::from_rsa(rsa)?;
let mut name = X509NameBuilder::new()?;
name.append_entry_by_text("CN", alias)?;
name.append_entry_by_text("O", "Unknown")?;
name.append_entry_by_text("OU", "Unknown")?;
let name = name.build();
let mut builder = X509Builder::new()?;
builder.set_version(2)?; builder.set_subject_name(&name)?;
builder.set_issuer_name(&name)?; builder.set_pubkey(&pkey)?;
{
use openssl::bn::BigNum;
let mut bn = BigNum::new()?;
bn.rand(64, openssl::bn::MsbOption::MAYBE_ZERO, false)?;
let serial = bn.to_asn1_integer()?;
builder.set_serial_number(&serial)?;
}
{
use openssl::asn1::Asn1Time;
let not_before = Asn1Time::days_from_now(0)?;
let not_after = Asn1Time::days_from_now(365)?;
builder.set_not_before(not_before.as_ref())?;
builder.set_not_after(not_after.as_ref())?;
}
builder.sign(&pkey, MessageDigest::sha256())?;
let cert = builder.build();
Ok((cert, pkey))
}