fix(generate):修复公钥证书无法生成的问题。

This commit is contained in:
徐涛 2024-04-02 12:29:58 +08:00
parent bf3add13a3
commit 0e3528baf8

View File

@ -4,7 +4,8 @@ use std::path::PathBuf;
use std::{io, path::Path}; use std::{io, path::Path};
use openssl::bn::BigNumContext; use openssl::bn::BigNumContext;
use openssl::x509::X509; use openssl::hash::MessageDigest;
use openssl::x509::{X509NameBuilder, X509};
use openssl::{ use openssl::{
asn1::{Asn1Integer, Asn1Time}, asn1::{Asn1Integer, Asn1Time},
bn::BigNum, bn::BigNum,
@ -33,11 +34,21 @@ pub fn generate_certificate(
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
let rsa = Rsa::generate(key_length)?; let rsa = Rsa::generate(key_length)?;
let private_key = rsa.private_key_to_pem()?; let private_key = rsa.private_key_to_pem()?;
let mut builder = X509Builder::new()?;
builder.set_version(version)?;
let pkey = PKey::from_rsa(rsa)?; let pkey = PKey::from_rsa(rsa)?;
let mut builder = X509Builder::new()?;
builder.set_pubkey(&pkey)?; builder.set_pubkey(&pkey)?;
let mut x509_name = X509NameBuilder::new()?;
x509_name.append_entry_by_text("CN", certificate_name)?;
x509_name.append_entry_by_text("C", "CN")?;
x509_name.append_entry_by_text("ST", "Hebei")?;
x509_name.append_entry_by_text("L", "Shi Jiazhuang")?;
x509_name.append_entry_by_text("O", "archgrid.xyz")?;
let x509_name = x509_name.build();
builder.set_subject_name(&x509_name)?;
builder.set_issuer_name(&x509_name)?;
builder.set_version(version)?;
let not_before = Asn1Time::days_from_now(0)?; let not_before = Asn1Time::days_from_now(0)?;
let not_after = Asn1Time::days_from_now(available_days)?; let not_after = Asn1Time::days_from_now(available_days)?;
builder.set_not_before(&not_before)?; builder.set_not_before(&not_before)?;
@ -46,6 +57,8 @@ pub fn generate_certificate(
let sn = Asn1Integer::from_bn(&serial_number)?; let sn = Asn1Integer::from_bn(&serial_number)?;
builder.set_serial_number(&sn)?; builder.set_serial_number(&sn)?;
builder.sign(&pkey, MessageDigest::sha256())?;
let certificate = builder.build(); let certificate = builder.build();
let store_path = PathBuf::from(storage_path); let store_path = PathBuf::from(storage_path);
@ -54,7 +67,8 @@ pub fn generate_certificate(
let cert_path = store_path.clone().join(format!("{}.pem", certificate_name)); let cert_path = store_path.clone().join(format!("{}.pem", certificate_name));
let cert_file = File::create(cert_path)?; let cert_file = File::create(cert_path)?;
let mut writer = BufWriter::new(cert_file); let mut writer = BufWriter::new(cert_file);
writer.write_all(&certificate.to_pem()?)?; let cert_data = certificate.to_pem()?;
writer.write_all(&cert_data)?;
writer.flush()?; writer.flush()?;
let private_key_path = store_path.join(format!("{}.key", certificate_name)); let private_key_path = store_path.join(format!("{}.key", certificate_name));