Skip to content

Commit 72714e5

Browse files
cpudjc
authored andcommitted
cert: use key_identifier_method of issuer for AKI
Previously when issuing a certificate with an authority key identifier (AKI) extension that's signed by an issuer certificate we had a small bug where we used the to-be-issued certificate's param's `key_identifier_method` to derive the key identifier of the issuing certificate to use for the issued certificate's AKI. Instead we should be using the issuer certificate's param's `key_identifier_method`, taking care to mind the pre-specified variant. We missed this with our unit testing of the pre-specified key identifier method because we only issued a self-signed test certificate, never issuing a certificate signed by the CA that has the customization. This commit fixes the bug and extends test coverage to prevent further regression.
1 parent 7db8619 commit 72714e5

File tree

2 files changed

+41
-22
lines changed

2 files changed

+41
-22
lines changed

rcgen/src/certificate.rs

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,7 @@ impl CertificateParams {
154154
issuer_key: &KeyPair,
155155
) -> Result<Certificate, Error> {
156156
let subject_public_key_info = key_pair.public_key_der();
157-
let der = self.serialize_der_with_signer(
158-
key_pair,
159-
issuer_key,
160-
&issuer.params.distinguished_name,
161-
)?;
157+
let der = self.serialize_der_with_signer(key_pair, issuer_key, &issuer.params)?;
162158
Ok(Certificate {
163159
params: self,
164160
subject_public_key_info,
@@ -172,7 +168,7 @@ impl CertificateParams {
172168
/// [`Certificate::pem`].
173169
pub fn self_signed(self, key_pair: &KeyPair) -> Result<Certificate, Error> {
174170
let subject_public_key_info = key_pair.public_key_der();
175-
let der = self.serialize_der_with_signer(key_pair, key_pair, &self.distinguished_name)?;
171+
let der = self.serialize_der_with_signer(key_pair, key_pair, &self)?;
176172
Ok(Certificate {
177173
params: self,
178174
subject_public_key_info,
@@ -567,7 +563,7 @@ impl CertificateParams {
567563
&self,
568564
pub_key: &K,
569565
issuer: &KeyPair,
570-
issuer_name: &DistinguishedName,
566+
issuer_params: &CertificateParams,
571567
) -> Result<CertificateDer<'static>, Error> {
572568
let der = issuer.sign_der(|writer| {
573569
let pub_key_spki =
@@ -596,7 +592,7 @@ impl CertificateParams {
596592
// Write signature algorithm
597593
issuer.alg.write_alg_ident(writer.next());
598594
// Write issuer name
599-
write_distinguished_name(writer.next(), issuer_name);
595+
write_distinguished_name(writer.next(), &issuer_params.distinguished_name);
600596
// Write validity
601597
writer.next().write_sequence(|writer| {
602598
// Not before
@@ -626,7 +622,13 @@ impl CertificateParams {
626622
if self.use_authority_key_identifier_extension {
627623
write_x509_authority_key_identifier(
628624
writer.next(),
629-
self.key_identifier_method.derive(issuer.public_key_der()),
625+
match &issuer_params.key_identifier_method {
626+
KeyIdMethod::PreSpecified(aki) => aki.clone(),
627+
#[cfg(feature = "crypto")]
628+
_ => issuer_params
629+
.key_identifier_method
630+
.derive(issuer.public_key_der()),
631+
},
630632
);
631633
}
632634
// Write subject_alt_names
@@ -1397,24 +1399,24 @@ PITGdT9dgN88nHPCle0B1+OY+OZ5
13971399
-----END PRIVATE KEY-----"#;
13981400

13991401
let params = CertificateParams::from_ca_cert_pem(ca_cert).unwrap();
1400-
let expected_ski = vec![
1402+
let ca_ski = vec![
14011403
0x97, 0xD4, 0x76, 0xA1, 0x9B, 0x1A, 0x71, 0x35, 0x2A, 0xC7, 0xF4, 0xA1, 0x84, 0x12,
14021404
0x56, 0x06, 0xBA, 0x5D, 0x61, 0x84,
14031405
];
14041406

14051407
assert_eq!(
1406-
KeyIdMethod::PreSpecified(expected_ski.clone()),
1408+
KeyIdMethod::PreSpecified(ca_ski.clone()),
14071409
params.key_identifier_method
14081410
);
14091411

1410-
let kp = KeyPair::from_pem(ca_key).unwrap();
1411-
let ca_cert = params.self_signed(&kp).unwrap();
1412-
assert_eq!(&expected_ski, &ca_cert.key_identifier());
1412+
let ca_kp = KeyPair::from_pem(ca_key).unwrap();
1413+
let ca_cert = params.self_signed(&ca_kp).unwrap();
1414+
assert_eq!(&ca_ski, &ca_cert.key_identifier());
14131415

1414-
let (_remainder, x509) = x509_parser::parse_x509_certificate(ca_cert.der()).unwrap();
1416+
let (_, x509_ca) = x509_parser::parse_x509_certificate(ca_cert.der()).unwrap();
14151417
assert_eq!(
1416-
&expected_ski,
1417-
&x509
1418+
&ca_ski,
1419+
&x509_ca
14181420
.iter_extensions()
14191421
.find_map(|ext| match ext.parsed_extension() {
14201422
x509_parser::extensions::ParsedExtension::SubjectKeyIdentifier(key_id) => {
@@ -1424,6 +1426,25 @@ PITGdT9dgN88nHPCle0B1+OY+OZ5
14241426
})
14251427
.unwrap()
14261428
);
1429+
1430+
let ee_key = KeyPair::generate().unwrap();
1431+
let mut ee_params = CertificateParams::default();
1432+
ee_params.use_authority_key_identifier_extension = true;
1433+
let ee_cert = ee_params.signed_by(&ee_key, &ca_cert, &ee_key).unwrap();
1434+
1435+
let (_, x509_ee) = x509_parser::parse_x509_certificate(ee_cert.der()).unwrap();
1436+
assert_eq!(
1437+
&ca_ski,
1438+
&x509_ee
1439+
.iter_extensions()
1440+
.find_map(|ext| match ext.parsed_extension() {
1441+
x509_parser::extensions::ParsedExtension::AuthorityKeyIdentifier(aki) => {
1442+
aki.key_identifier.as_ref().map(|ki| ki.0.to_vec())
1443+
},
1444+
_ => None,
1445+
})
1446+
.unwrap()
1447+
);
14271448
}
14281449
}
14291450
}

rcgen/src/csr.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,9 @@ impl CertificateSigningRequestParams {
149149
issuer: &Certificate,
150150
issuer_key: &KeyPair,
151151
) -> Result<Certificate, Error> {
152-
let der = self.params.serialize_der_with_signer(
153-
&self.public_key,
154-
issuer_key,
155-
&issuer.params.distinguished_name,
156-
)?;
152+
let der =
153+
self.params
154+
.serialize_der_with_signer(&self.public_key, issuer_key, &issuer.params)?;
157155
let subject_public_key_info = yasna::construct_der(|writer| {
158156
self.public_key.serialize_public_key_der(writer);
159157
});

0 commit comments

Comments
 (0)