-
Notifications
You must be signed in to change notification settings - Fork 77
Expand file tree
/
Copy pathlib.rs
More file actions
91 lines (86 loc) · 3.12 KB
/
lib.rs
File metadata and controls
91 lines (86 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// SPDX-FileCopyrightText: © 2025 Phala Network <dstack@phala.network>
//
// SPDX-License-Identifier: Apache-2.0
use anyhow::{Context, Result};
use dstack_kms_rpc::{kms_client::KmsClient, SignCertRequest};
use dstack_types::{AppKeys, KeyProvider};
use ra_rpc::client::{RaClient, RaClientConfig};
use ra_tls::cert::{generate_ra_cert, CaCert, CertSigningRequestV2};
pub enum CertRequestClient {
Local {
ca: Box<CaCert>,
},
Kms {
client: KmsClient<RaClient>,
vm_config: String,
},
}
impl CertRequestClient {
pub async fn sign_csr(
&self,
csr: &CertSigningRequestV2,
signature: &[u8],
) -> Result<Vec<String>> {
match self {
CertRequestClient::Local { ca } => {
let cert = ca
.sign_csr(csr, None, "app:custom")
.context("Failed to sign certificate")?;
Ok(vec![cert.pem(), ca.pem_cert.clone()])
}
CertRequestClient::Kms { client, vm_config } => {
let response = client
.sign_cert(SignCertRequest {
api_version: 2,
csr: csr.to_vec(),
signature: signature.to_vec(),
vm_config: vm_config.clone(),
})
.await?;
Ok(response.certificate_chain)
}
}
}
pub async fn get_root_ca(&self) -> Result<String> {
match self {
CertRequestClient::Local { ca } => Ok(ca.pem_cert.clone()),
CertRequestClient::Kms { client, .. } => Ok(client.get_meta().await?.ca_cert),
}
}
pub async fn create(
keys: &AppKeys,
pccs_url: Option<&str>,
vm_config: String,
) -> Result<CertRequestClient> {
match &keys.key_provider {
KeyProvider::None { key }
| KeyProvider::Local { key, .. }
| KeyProvider::Tpm { key, .. } => {
let ca = CaCert::new(keys.ca_cert.clone(), key.clone())
.context("Failed to create CA")?;
Ok(CertRequestClient::Local { ca: Box::new(ca) })
}
KeyProvider::Kms {
url,
tmp_ca_key,
tmp_ca_cert,
..
} => {
let client_cert = generate_ra_cert(tmp_ca_cert.clone(), tmp_ca_key.clone())
.context("Failed to generate RA cert")?;
let ra_client = RaClientConfig::builder()
.remote_uri(url.clone())
.tls_client_cert(client_cert.cert_pem)
.tls_client_key(client_cert.key_pem)
.tls_ca_cert(keys.ca_cert.clone())
.tls_built_in_root_certs(false)
.maybe_pccs_url(pccs_url.map(|s| s.to_string()))
.build()
.into_client()
.context("Failed to create RA client")?;
let client = KmsClient::new(ra_client);
Ok(CertRequestClient::Kms { client, vm_config })
}
}
}
}