@@ -7,6 +7,7 @@ use dstack_kms_rpc::{
77 onboard_server:: { OnboardRpc , OnboardServer } ,
88 BootstrapRequest , BootstrapResponse , OnboardRequest , OnboardResponse ,
99} ;
10+ use fs_err as fs;
1011use http_client:: prpc:: PrpcClient ;
1112use k256:: ecdsa:: SigningKey ;
1213use ra_rpc:: { client:: RaClient , CallContext , RpcCall } ;
@@ -102,6 +103,7 @@ struct Keys {
102103 ca_cert : Certificate ,
103104 rpc_key : KeyPair ,
104105 rpc_cert : Certificate ,
106+ rpc_domain : String ,
105107}
106108
107109impl Keys {
@@ -169,6 +171,7 @@ impl Keys {
169171 ca_cert,
170172 rpc_key,
171173 rpc_cert,
174+ rpc_domain : domain. to_string ( ) ,
172175 } )
173176 }
174177
@@ -216,25 +219,59 @@ impl Keys {
216219 }
217220
218221 fn store ( & self , cfg : & KmsConfig ) -> Result < ( ) > {
219- // Store the temporary CA cert and key
220- safe_write ( cfg. tmp_ca_cert ( ) , self . tmp_ca_cert . pem ( ) ) ?;
221- safe_write ( cfg. tmp_ca_key ( ) , self . tmp_ca_key . serialize_pem ( ) ) ?;
222+ self . store_keys ( cfg) ?;
223+ self . store_certs ( cfg) ?;
224+ safe_write ( cfg. rpc_domain ( ) , self . rpc_domain . as_bytes ( ) ) ?;
225+ Ok ( ( ) )
226+ }
222227
223- // Store the root CA cert and key
224- safe_write ( cfg. root_ca_cert ( ) , self . ca_cert . pem ( ) ) ?;
228+ fn store_keys ( & self , cfg : & KmsConfig ) -> Result < ( ) > {
229+ safe_write ( cfg. tmp_ca_key ( ) , self . tmp_ca_key . serialize_pem ( ) ) ?;
225230 safe_write ( cfg. root_ca_key ( ) , self . ca_key . serialize_pem ( ) ) ?;
226-
227- // Store the RPC cert and key
228- safe_write ( cfg. rpc_cert ( ) , self . rpc_cert . pem ( ) ) ?;
229231 safe_write ( cfg. rpc_key ( ) , self . rpc_key . serialize_pem ( ) ) ?;
230-
231- // Store the ECDSA root key
232232 safe_write ( cfg. k256_key ( ) , self . k256_key . to_bytes ( ) ) ?;
233+ Ok ( ( ) )
234+ }
233235
236+ fn store_certs ( & self , cfg : & KmsConfig ) -> Result < ( ) > {
237+ safe_write ( cfg. tmp_ca_cert ( ) , self . tmp_ca_cert . pem ( ) ) ?;
238+ safe_write ( cfg. root_ca_cert ( ) , self . ca_cert . pem ( ) ) ?;
239+ safe_write ( cfg. rpc_cert ( ) , self . rpc_cert . pem ( ) ) ?;
234240 Ok ( ( ) )
235241 }
236242}
237243
244+ pub ( crate ) async fn update_certs ( cfg : & KmsConfig ) -> Result < ( ) > {
245+ // Read existing keys
246+ let tmp_ca_key = KeyPair :: from_pem ( & fs:: read_to_string ( cfg. tmp_ca_key ( ) ) ?) ?;
247+ let ca_key = KeyPair :: from_pem ( & fs:: read_to_string ( cfg. root_ca_key ( ) ) ?) ?;
248+ let rpc_key = KeyPair :: from_pem ( & fs:: read_to_string ( cfg. rpc_key ( ) ) ?) ?;
249+
250+ // Read k256 key
251+ let k256_key_bytes = fs:: read ( cfg. k256_key ( ) ) ?;
252+ let k256_key = SigningKey :: from_slice ( & k256_key_bytes) ?;
253+
254+ let domain = fs:: read_to_string ( cfg. rpc_domain ( ) ) ?;
255+ let domain = domain. trim ( ) ;
256+
257+ // Regenerate certificates using existing keys
258+ let keys = Keys :: from_keys (
259+ tmp_ca_key,
260+ ca_key,
261+ rpc_key,
262+ k256_key,
263+ domain,
264+ cfg. onboard . quote_enabled ,
265+ )
266+ . await
267+ . context ( "Failed to regenerate certificates" ) ?;
268+
269+ // Write the new certificates to files
270+ keys. store_certs ( cfg) ?;
271+
272+ Ok ( ( ) )
273+ }
274+
238275pub ( crate ) async fn bootstrap_keys ( cfg : & KmsConfig ) -> Result < ( ) > {
239276 let keys = Keys :: generate (
240277 & cfg. onboard . auto_bootstrap_domain ,
0 commit comments