Skip to content

Commit 1071fc8

Browse files
committed
refactor(cert): move csr assembly out of cert-client
1 parent 22b74ff commit 1071fc8

3 files changed

Lines changed: 43 additions & 45 deletions

File tree

cert-client/src/lib.rs

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@ use anyhow::{Context, Result};
66
use dstack_kms_rpc::{kms_client::KmsClient, SignCertRequest};
77
use dstack_types::{AppKeys, KeyProvider};
88
use ra_rpc::client::{RaClient, RaClientConfig};
9-
use ra_tls::{
10-
attestation::{QuoteContentType, VersionedAttestation},
11-
cert::{generate_ra_cert, CaCert, CertConfigV2, CertSigningRequestV2, Csr},
12-
rcgen::KeyPair,
13-
};
9+
use ra_tls::cert::{generate_ra_cert, CaCert, CertSigningRequestV2};
1410

1511
pub enum CertRequestClient {
1612
Local {
@@ -92,35 +88,4 @@ impl CertRequestClient {
9288
}
9389
}
9490
}
95-
96-
pub async fn request_cert(&self, key: &KeyPair, config: CertConfigV2) -> Result<Vec<String>> {
97-
let pubkey = key.public_key_der();
98-
let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey);
99-
let attestation = ra_rpc::Attestation::quote(&report_data)
100-
.context("Failed to get quote for cert pubkey")?
101-
.into_versioned();
102-
self.sign_cert_with_attestation(key, config, attestation).await
103-
}
104-
105-
pub async fn sign_cert_with_attestation(
106-
&self,
107-
key: &KeyPair,
108-
config: CertConfigV2,
109-
mut attestation: VersionedAttestation,
110-
) -> Result<Vec<String>> {
111-
let pubkey = key.public_key_der();
112-
let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey);
113-
attestation.set_report_data(report_data);
114-
115-
let csr = CertSigningRequestV2 {
116-
confirm: "please sign cert:".to_string(),
117-
pubkey,
118-
config,
119-
attestation,
120-
};
121-
let signature = csr.signed_by(key).context("Failed to sign the CSR")?;
122-
self.sign_csr(&csr, &signature)
123-
.await
124-
.context("Failed to sign the CSR")
125-
}
12691
}

dstack-util/src/system_setup.rs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@ use luks2::{
2727
LuksAf, LuksConfig, LuksDigest, LuksHeader, LuksJson, LuksKdf, LuksKeyslot, LuksSegment,
2828
LuksSegmentSize,
2929
};
30-
use ra_rpc::client::{CertInfo, RaClient, RaClientConfig};
31-
use ra_tls::cert::{generate_ra_cert, CertConfigV2};
30+
use ra_rpc::{client::{CertInfo, RaClient, RaClientConfig}, Attestation};
31+
use ra_tls::{
32+
attestation::QuoteContentType,
33+
cert::{generate_ra_cert, CertConfigV2, CertSigningRequestV2, Csr},
34+
};
3235
use rand::Rng as _;
3336
use safe_write::safe_write;
3437
use scopeguard::defer;
@@ -53,6 +56,30 @@ use ra_tls::rcgen::{KeyPair, PKCS_ECDSA_P256_SHA256};
5356
use serde_human_bytes as hex_bytes;
5457
use serde_json::Value;
5558

59+
60+
async fn sign_cert_request(
61+
cert_client: &CertRequestClient,
62+
key: &KeyPair,
63+
config: CertConfigV2,
64+
) -> Result<Vec<String>> {
65+
let pubkey = key.public_key_der();
66+
let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey);
67+
let attestation = Attestation::quote(&report_data)
68+
.context("Failed to get quote for cert pubkey")?
69+
.into_versioned();
70+
let csr = CertSigningRequestV2 {
71+
confirm: "please sign cert:".to_string(),
72+
pubkey,
73+
config,
74+
attestation,
75+
};
76+
let signature = csr.signed_by(key).context("Failed to sign the CSR")?;
77+
cert_client
78+
.sign_csr(&csr, &signature)
79+
.await
80+
.context("Failed to sign the CSR")
81+
}
82+
5683
mod config_id_verifier;
5784

5885
#[derive(clap::Parser)]
@@ -500,8 +527,7 @@ impl<'a> GatewayContext<'a> {
500527
not_before: None,
501528
not_after: Some(cert_not_after),
502529
};
503-
let certs = cert_client
504-
.request_cert(&key, config, None)
530+
let certs = sign_cert_request(&cert_client, &key, config)
505531
.await
506532
.context("Failed to request cert")?;
507533
let client_cert = certs.join("\n");
@@ -520,8 +546,7 @@ impl<'a> GatewayContext<'a> {
520546
not_before: None,
521547
not_after: Some(cert_not_after),
522548
};
523-
let certs_with_quote = cert_client
524-
.request_cert(&key, config_with_quote, None)
549+
let certs_with_quote = sign_cert_request(&cert_client, &key, config_with_quote)
525550
.await
526551
.context("Failed to request cert with quote")?;
527552
let client_cert_with_quote = certs_with_quote.join("\n");

guest-agent/src/rpc_service.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use or_panic::ResultOrPanic;
2727
use ra_rpc::{CallContext, RpcCall};
2828
use ra_tls::{
2929
attestation::{QuoteContentType, DEFAULT_HASH_ALGORITHM},
30-
cert::CertConfigV2,
30+
cert::{CertConfigV2, CertSigningRequestV2, Csr},
3131
kdf::{derive_key, derive_p256_key_pair_from_bytes},
3232
};
3333
use rcgen::KeyPair;
@@ -67,12 +67,20 @@ impl AppStateInner {
6767
}
6868

6969
async fn issue_cert(&self, key: &KeyPair, config: CertConfigV2) -> Result<Vec<String>> {
70+
let pubkey = key.public_key_der();
7071
let attestation = self
7172
.platform
72-
.certificate_attestation(&key.public_key_der())
73+
.certificate_attestation(&pubkey)
7374
.context("Failed to get certificate attestation")?;
75+
let csr = CertSigningRequestV2 {
76+
confirm: "please sign cert:".to_string(),
77+
pubkey,
78+
config,
79+
attestation,
80+
};
81+
let signature = csr.signed_by(key).context("Failed to sign the CSR")?;
7482
self.cert_client
75-
.sign_cert_with_attestation(key, config, attestation)
83+
.sign_csr(&csr, &signature)
7684
.await
7785
.context("Failed to sign the CSR")
7886
}

0 commit comments

Comments
 (0)