ca: Add sign_user_cert function

The `sshca::ca::sign_cert` function has been renamed to
`sign_host_cert`, reflecting that it creates SSH host certificates.  A
new `sign_user_cert` function is now available to sign SSH user
certificates.
master
Dustin 2023-11-21 21:26:16 -06:00
parent 94ae6f727e
commit cd7a7272ef
2 changed files with 31 additions and 4 deletions

View File

@ -137,12 +137,38 @@ pub fn parse_public_key(data: &[u8]) -> Result<PublicKey, LoadKeyError> {
/// This function creates a signed certificate for an SSH host public /// This function creates a signed certificate for an SSH host public
/// key. The certificate will be valid for the specified hostname and /// key. The certificate will be valid for the specified hostname and
/// any alias names provided. /// any alias names provided.
pub fn sign_cert( pub fn sign_host_cert(
hostname: &str, hostname: &str,
pubkey: &PublicKey, pubkey: &PublicKey,
duration: Duration, duration: Duration,
privkey: &PrivateKey, privkey: &PrivateKey,
alias: &[&str], alias: &[&str],
) -> Result<Certificate, CertError> {
sign_cert(hostname, pubkey, duration, privkey, alias, CertType::Host)
}
/// Create a signed SSH certificate for a user public key
///
/// This function creates a signed certificate for an SSH user public
/// key. The certificate will be valid for the specified username and
/// any alias names provided.
pub fn sign_user_cert(
username: &str,
pubkey: &PublicKey,
duration: Duration,
privkey: &PrivateKey,
alias: &[&str],
) -> Result<Certificate, CertError> {
sign_cert(username, pubkey, duration, privkey, alias, CertType::User)
}
fn sign_cert(
principal: &str,
pubkey: &PublicKey,
duration: Duration,
privkey: &PrivateKey,
alias: &[&str],
cert_type: CertType,
) -> Result<Certificate, CertError> { ) -> Result<Certificate, CertError> {
let now = SystemTime::now(); let now = SystemTime::now();
let not_before = now.duration_since(UNIX_EPOCH)?.as_secs(); let not_before = now.duration_since(UNIX_EPOCH)?.as_secs();
@ -151,8 +177,8 @@ pub fn sign_cert(
let mut builder = Builder::new_with_random_nonce( let mut builder = Builder::new_with_random_nonce(
&mut OsRng, pubkey, not_before, not_after, &mut OsRng, pubkey, not_before, not_after,
)?; )?;
builder.cert_type(CertType::Host)?; builder.cert_type(cert_type)?;
builder.valid_principal(hostname)?; builder.valid_principal(principal)?;
for a in alias { for a in alias {
builder.valid_principal(*a)?; builder.valid_principal(*a)?;
} }

View File

@ -211,7 +211,8 @@ pub(super) async fn sign_host_cert(
pubkey.algorithm().as_str(), pubkey.algorithm().as_str(),
hostname hostname
); );
let cert = ca::sign_cert(&hostname, &pubkey, duration, &privkey, &[])?; let cert =
ca::sign_host_cert(&hostname, &pubkey, duration, &privkey, &[])?;
info!( info!(
"Signed {} key for {}", "Signed {} key for {}",
pubkey.algorithm().as_str(), pubkey.algorithm().as_str(),