Skip to content

Commit ad9b094

Browse files
lvkvcpu
authored andcommitted
Fix: Don't forget to write EKUs in CSRs
1 parent 5811e47 commit ad9b094

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

rcgen/src/certificate.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,12 @@ impl CertificateParams {
546546
return Err(Error::UnsupportedInCsr);
547547
}
548548

549+
// Whether or not to write an extension request attribute
550+
let write_extension_request = !key_usages.is_empty()
551+
|| !subject_alt_names.is_empty()
552+
|| !extended_key_usages.is_empty()
553+
|| !custom_extensions.is_empty();
554+
549555
let der = subject_key.sign_der(|writer| {
550556
// Write version
551557
writer.next().write_u8(0);
@@ -556,10 +562,7 @@ impl CertificateParams {
556562
// Write extensions
557563
// According to the spec in RFC 2986, even if attributes are empty we need the empty attribute tag
558564
writer.next().write_tagged(Tag::context(0), |writer| {
559-
if !key_usages.is_empty()
560-
|| !subject_alt_names.is_empty()
561-
|| !custom_extensions.is_empty()
562-
{
565+
if write_extension_request {
563566
writer.write_sequence(|writer| {
564567
let oid = ObjectIdentifier::from_slice(oid::PKCS_9_AT_EXTENSION_REQUEST);
565568
writer.next().write_oid(&oid);

rcgen/tests/generic.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,25 @@ mod test_csr_extension_request {
375375
.unwrap()
376376
.any(|ext| matches!(ext, ParsedExtension::SubjectAlternativeName(_))));
377377
}
378+
379+
#[test]
380+
fn write_extension_request_if_ekus_are_present() {
381+
let mut params = CertificateParams::default();
382+
params
383+
.extended_key_usages
384+
.push(ExtendedKeyUsagePurpose::ClientAuth);
385+
let key_pair = KeyPair::generate().unwrap();
386+
let csr = params.serialize_request(&key_pair).unwrap();
387+
let (_, parsed_csr) = X509CertificationRequest::from_der(csr.der()).unwrap();
388+
let requested_extensions = parsed_csr
389+
.requested_extensions()
390+
.unwrap()
391+
.collect::<Vec<_>>();
392+
assert!(matches!(
393+
requested_extensions.first().unwrap(),
394+
ParsedExtension::ExtendedKeyUsage(_)
395+
));
396+
}
378397
}
379398

380399
#[cfg(feature = "x509-parser")]

0 commit comments

Comments
 (0)