MCPcopy Create free account
hub / github.com/NVIDIA/OpenShell / generate_pki

Function generate_pki

crates/openshell-bootstrap/src/pki.rs:52–128  ·  view source on GitHub ↗

Generate a complete PKI bundle: CA, server cert, and client cert. `extra_sans` are additional Subject Alternative Names to add to the server certificate (e.g. the remote host's IP or hostname for remote deployments). Certificate validity uses the `rcgen` defaults (1975–4096), which effectively never expire. This is appropriate for an internal dev-cluster PKI where certs are ephemeral to the clus

(extra_sans: &[String])

Source from the content-addressed store, hash-verified

50/// never expire. This is appropriate for an internal dev-cluster PKI where certs
51/// are ephemeral to the cluster's lifetime.
52pub fn generate_pki(extra_sans: &[String]) -> Result<PkiBundle> {
53 // --- CA ---
54 let ca_key = KeyPair::generate()
55 .into_diagnostic()
56 .wrap_err("failed to generate CA key")?;
57 let mut ca_params = CertificateParams::new(Vec::<String>::new())
58 .into_diagnostic()
59 .wrap_err("failed to create CA params")?;
60 ca_params.is_ca = IsCa::Ca(BasicConstraints::Unconstrained);
61 ca_params
62 .distinguished_name
63 .push(DnType::OrganizationName, "openshell");
64 ca_params
65 .distinguished_name
66 .push(DnType::CommonName, "openshell-ca");
67
68 let ca_cert = ca_params
69 .self_signed(&ca_key)
70 .into_diagnostic()
71 .wrap_err("failed to self-sign CA certificate")?;
72
73 // --- Server cert ---
74 let server_key = KeyPair::generate()
75 .into_diagnostic()
76 .wrap_err("failed to generate server key")?;
77 let server_sans = build_server_sans(extra_sans);
78 let mut server_params = CertificateParams::new(Vec::<String>::new())
79 .into_diagnostic()
80 .wrap_err("failed to create server cert params")?;
81 server_params.subject_alt_names = server_sans;
82 server_params
83 .distinguished_name
84 .push(DnType::CommonName, "openshell-server");
85
86 let server_cert = server_params
87 .signed_by(&server_key, &ca_cert, &ca_key)
88 .into_diagnostic()
89 .wrap_err("failed to sign server certificate")?;
90
91 // --- Client cert (shared by CLI and sandbox pods) ---
92 let client_key = KeyPair::generate()
93 .into_diagnostic()
94 .wrap_err("failed to generate client key")?;
95 let mut client_params = CertificateParams::new(Vec::<String>::new())
96 .into_diagnostic()
97 .wrap_err("failed to create client cert params")?;
98 client_params
99 .distinguished_name
100 .push(DnType::CommonName, "openshell-client");
101 client_params
102 .distinguished_name
103 .push(DnType::OrganizationalUnitName, "openshell-user");
104
105 let client_cert = client_params
106 .signed_by(&client_key, &ca_cert, &ca_key)
107 .into_diagnostic()
108 .wrap_err("failed to sign client certificate")?;
109

Callers 2

Calls 3

build_server_sansFunction · 0.85
generate_jwt_keyFunction · 0.85
pushMethod · 0.80

Tested by 2