Skip to content

Commit d635f19

Browse files
whitslackrustyrussell
authored andcommitted
plugins: generate certificates with required extensions
Recent versions of urllib3 fail certificate verification if certificates lack the Authority Key Identifier or Key Usages extensions: ``` SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Missing Authority Key Identifier (_ssl.c:1032) SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: CA cert does not include key usage extension (_ssl.c:1032) ``` Luckily, rcgen offers parameters in its CertificateParams structure to add these extensions. Let's use them. Changelog-Fixed: Certificates auto-generated by grpc-plugin, rest-plugin, and wss-proxy-plugin now include the required Authority Key Identifier and Key Usages extensions.
1 parent fcd92fe commit d635f19

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

plugins/grpc-plugin/src/tls.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,19 @@ fn generate_or_load_identity(
9696
// Configure the certificate we want.
9797
let subject_alt_names = vec!["cln".to_string(), "localhost".to_string()];
9898
let mut params = rcgen::CertificateParams::new(subject_alt_names)?;
99-
params.is_ca = if parent.is_none() {
100-
rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained)
99+
if parent.is_none() {
100+
params.is_ca = rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained);
101+
params.key_usages.push(rcgen::KeyUsagePurpose::KeyCertSign);
101102
} else {
102-
rcgen::IsCa::NoCa
103-
};
103+
params.is_ca = rcgen::IsCa::NoCa;
104+
params.key_usages.push(rcgen::KeyUsagePurpose::DigitalSignature);
105+
params.key_usages.push(rcgen::KeyUsagePurpose::KeyEncipherment);
106+
params.key_usages.push(rcgen::KeyUsagePurpose::KeyAgreement);
107+
}
104108
params
105109
.distinguished_name
106110
.push(rcgen::DnType::CommonName, name);
111+
params.use_authority_key_identifier_extension = true;
107112

108113
let cert = match parent {
109114
None => params.self_signed(&keypair),

plugins/rest-plugin/src/certs.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ pub fn generate_certificates(certs_path: &PathBuf, rest_host: &str) -> Result<()
1212
"localhost".to_string(),
1313
])?;
1414
ca_params.is_ca = rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained);
15+
ca_params.key_usages.push(rcgen::KeyUsagePurpose::KeyCertSign);
16+
ca_params.use_authority_key_identifier_extension = true;
1517
let ca_key = KeyPair::generate()?;
1618
let ca_cert = ca_params.self_signed(&ca_key)?;
1719

@@ -30,6 +32,10 @@ pub fn generate_certificates(certs_path: &PathBuf, rest_host: &str) -> Result<()
3032
"localhost".to_string(),
3133
])?;
3234
server_params.is_ca = rcgen::IsCa::NoCa;
35+
server_params.key_usages.push(rcgen::KeyUsagePurpose::DigitalSignature);
36+
server_params.key_usages.push(rcgen::KeyUsagePurpose::KeyEncipherment);
37+
server_params.key_usages.push(rcgen::KeyUsagePurpose::KeyAgreement);
38+
server_params.use_authority_key_identifier_extension = true;
3339
server_params.distinguished_name = DistinguishedName::new();
3440
server_params
3541
.distinguished_name

plugins/wss-proxy-plugin/src/certs.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ pub fn generate_certificates(certs_path: &PathBuf, wss_host: &[String]) -> Resul
1818
"localhost".to_string(),
1919
])?;
2020
ca_params.is_ca = rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained);
21+
ca_params.key_usages.push(rcgen::KeyUsagePurpose::KeyCertSign);
22+
ca_params.use_authority_key_identifier_extension = true;
2123
let ca_key = KeyPair::generate()?;
2224
let ca_cert = ca_params.self_signed(&ca_key)?;
2325

@@ -36,6 +38,10 @@ pub fn generate_certificates(certs_path: &PathBuf, wss_host: &[String]) -> Resul
3638
"localhost".to_string(),
3739
])?;
3840
server_params.is_ca = rcgen::IsCa::NoCa;
41+
server_params.key_usages.push(rcgen::KeyUsagePurpose::DigitalSignature);
42+
server_params.key_usages.push(rcgen::KeyUsagePurpose::KeyEncipherment);
43+
server_params.key_usages.push(rcgen::KeyUsagePurpose::KeyAgreement);
44+
server_params.use_authority_key_identifier_extension = true;
3945
server_params.distinguished_name = DistinguishedName::new();
4046
server_params
4147
.distinguished_name

0 commit comments

Comments
 (0)