1- //! Server implementation
2-
3- use super :: RealmCaCert ;
41use super :: RealmClientCert ;
2+ use super :: RealmClusterCert ;
53use super :: RealmData ;
64use super :: RealmName ;
75use super :: RealmServerCert ;
86use anyhow:: Result ;
7+ use anyhow:: anyhow;
98use anyhow:: bail;
109use axum:: {
1110 Extension , extract:: Request , middleware:: AddExtension , middleware:: Next , response:: Response ,
@@ -36,14 +35,15 @@ use std::io;
3635use std:: sync:: Arc ;
3736use tempfile:: TempDir ;
3837use tempfile:: tempdir;
38+ use time:: Duration ;
3939use time:: OffsetDateTime ;
4040use tokio:: io:: { AsyncRead , AsyncWrite } ;
4141use tokio_rustls:: server:: TlsStream ;
4242use tower:: Layer ;
4343use tracing:: debug;
4444use x509_parser:: prelude:: { FromDer , X509Certificate } ;
4545
46- impl super :: RealmCaCert {
46+ impl super :: RealmClusterCert {
4747 /// Generate a new realm CA certificate.
4848 pub fn new ( cluster_id : ClusterId , name : RealmName ) -> Result < Self > {
4949 // Generate key
@@ -53,6 +53,7 @@ impl super::RealmCaCert {
5353 let mut cert_params = CertificateParams :: default ( ) ;
5454 cert_params. is_ca = IsCa :: Ca ( BasicConstraints :: Unconstrained ) ;
5555 cert_params. not_before = OffsetDateTime :: now_utc ( ) ;
56+ cert_params. not_after = OffsetDateTime :: now_utc ( ) . saturating_add ( Duration :: days ( 36780 ) ) ;
5657 cert_params. subject_alt_names = vec ! [ SanType :: DnsName ( cluster_id. to_string( ) . try_into( ) ?) ] ;
5758
5859 // TODO still needed?
@@ -68,7 +69,7 @@ impl super::RealmCaCert {
6869 Ok ( Self {
6970 name,
7071 cert : cert. pem ( ) ,
71- key : keypair. serialize_pem ( ) ,
72+ key : Some ( keypair. serialize_pem ( ) ) ,
7273 } )
7374 }
7475
@@ -78,10 +79,12 @@ impl super::RealmCaCert {
7879 Ok ( CertificateParams :: from_ca_cert_der (
7980 & pem:: parse ( & self . cert ) ?. into_contents ( ) . try_into ( ) ?,
8081 ) ?
81- . self_signed ( & KeyPair :: from_pem ( & self . key ) ?) ?)
82+ . self_signed ( & KeyPair :: from_pem (
83+ & self . key . ok_or_else ( || anyhow ! ( "No key" ) ) ?,
84+ ) ?) ?)
8285 }
8386
84- /// Generate a new _clientAuth_ certificate signed by the realm's CA .
87+ /// Generate a new realm certificate for client instances .
8588 pub fn client_cert ( & self ) -> Result < RealmClientCert > {
8689 // Generate key
8790 let keypair = KeyPair :: generate ( ) ?;
@@ -92,10 +95,10 @@ impl super::RealmCaCert {
9295 . extended_key_usages
9396 . push ( ExtendedKeyUsagePurpose :: ClientAuth ) ;
9497 cert_params. not_before = OffsetDateTime :: now_utc ( ) ;
98+ cert_params. not_after = OffsetDateTime :: now_utc ( ) . saturating_add ( Duration :: days ( 365 ) ) ;
9599 cert_params
96100 . distinguished_name
97101 . push ( DnType :: CommonName , & * self . name ) ;
98- // TODO not_after of 1 month
99102
100103 // Generate the certificate signed by the CA
101104 let cert = cert_params. signed_by ( & keypair, & self . ca ( ) ?, & KeyPair :: from_pem ( & self . key ) ?) ?;
@@ -104,11 +107,11 @@ impl super::RealmCaCert {
104107 Ok ( RealmClientCert {
105108 ca : self . ca ( ) ?. pem ( ) ,
106109 cert : cert. pem ( ) ,
107- key : keypair. serialize_pem ( ) ,
110+ key : Some ( keypair. serialize_pem ( ) ) ,
108111 } )
109112 }
110113
111- /// Generate a new _serverAuth_ certificate signed by the realm's CA .
114+ /// Generate a new realm certificate for server instances .
112115 pub fn server_cert ( & self , server_id : InstanceId ) -> Result < RealmServerCert > {
113116 if !server_id. is_type ( InstanceType :: Server ) {
114117 bail ! ( "A server ID is required" ) ;
@@ -123,18 +126,22 @@ impl super::RealmCaCert {
123126 . extended_key_usages
124127 . push ( ExtendedKeyUsagePurpose :: ServerAuth ) ;
125128 cert_params. not_before = OffsetDateTime :: now_utc ( ) ;
129+ cert_params. not_after = OffsetDateTime :: now_utc ( ) . saturating_add ( Duration :: days ( 365 ) ) ;
126130 cert_params. subject_alt_names = vec ! [ SanType :: DnsName (
127131 format!( "{server_id}.{}" , self . name) . try_into( ) ?,
128132 ) ] ;
129- // TODO not_after of 1 year
130133
131134 // Generate the certificate signed by the CA
132- let cert = cert_params. signed_by ( & keypair, & self . ca ( ) ?, & KeyPair :: from_pem ( & self . key ) ?) ?;
135+ let cert = cert_params. signed_by (
136+ & keypair,
137+ & self . ca ( ) ?,
138+ & KeyPair :: from_pem ( & self . key . ok_or_else ( || anyhow ! ( "No key" ) ) ?) ?,
139+ ) ?;
133140
134141 debug ! ( cert = ?cert. params( ) , "Generated new realm server certificate" ) ;
135142 Ok ( RealmServerCert {
136143 cert : cert. pem ( ) ,
137- key : keypair. serialize_pem ( ) ,
144+ key : Some ( keypair. serialize_pem ( ) ) ,
138145 } )
139146 }
140147}
@@ -157,7 +164,7 @@ mod test_realm_ca {
157164
158165 #[ test]
159166 fn test_generate_and_authenticate ( ) -> Result < ( ) > {
160- let ca = RealmCaCert :: new ( ClusterId :: default ( ) , "default" . parse ( ) ?) ?;
167+ let ca = RealmClusterCert :: new ( ClusterId :: default ( ) , "default" . parse ( ) ?) ?;
161168 let client = ca. client_cert ( ) ?;
162169 let server = ca. server_cert ( InstanceId :: new_server ( ) ) ?;
163170
@@ -207,38 +214,53 @@ pub struct TlsData {
207214 peer_certificates : Option < Vec < CertificateDer < ' static > > > ,
208215}
209216
217+ /// Accepts TLS connections with realm certificates.
210218#[ derive( Debug , Clone ) ]
211219pub struct RealmAcceptor ( RustlsAcceptor ) ;
212220
213221impl RealmAcceptor {
214- pub fn new ( realms : Collection < RealmData > ) -> Result < Self > {
222+ pub fn new ( realms : Vec < RealmData > ) -> Result < Self > {
215223 let mut roots = RootCertStore :: empty ( ) ;
216224 let mut sni_resolver = ResolvesServerCertUsingSni :: new ( ) ;
217225
218226 let config = ServerConfig :: builder ( ) ;
219227
220- for realm in realms. documents ( ) {
221- let realm = realm?;
222- let ca: Document < RealmCaCert > = realm. get_document ( "ca" ) ?. unwrap ( ) ;
223- let server: Document < RealmServerCert > = realm. get_document ( "server" ) ?. unwrap ( ) ;
224-
225- roots. add ( pem:: parse ( & ca. data . cert ) ?. into_contents ( ) . try_into ( ) ?) ?;
228+ for realm in realms {
229+ // Add cluster cert as a CA cert to the root store
230+ {
231+ let cluster_cert: & RealmClusterCert = realm
232+ . cluster_cert
233+ . as_ref ( )
234+ . ok_or_else ( || anyhow ! ( "No cluster cert" ) ?) ;
226235
227- let private_key = config
228- . crypto_provider ( )
229- . key_provider
230- . load_private_key ( PrivateKeyDer :: from_pem_slice ( & server. data . key . as_bytes ( ) ) ?) ?;
231-
232- sni_resolver. add (
233- & server. data . subject_name ( ) ?,
234- rustls:: sign:: CertifiedKey :: new (
235- vec ! [ pem:: parse( & server. data. cert) ?. into_contents( ) . try_into( ) ?] ,
236- private_key,
237- ) ,
238- ) ?;
236+ roots. add ( pem:: parse ( & cluster_cert. cert ) ?. into_contents ( ) . try_into ( ) ?) ?;
237+ }
239238
240- // TODO
241- break ;
239+ // Add server cert to the SNI resolver
240+ {
241+ let server_cert: Document < RealmServerCert > = realm. get_document ( "server" ) ?. unwrap ( ) ;
242+ let private_key = config. crypto_provider ( ) . key_provider . load_private_key (
243+ PrivateKeyDer :: from_pem_slice (
244+ & server_cert
245+ . data
246+ . key
247+ . ok_or_else ( || anyhow ! ( "No server key" ) ?)
248+ . as_bytes ( ) ,
249+ ) ?,
250+ ) ?;
251+
252+ sni_resolver. add (
253+ & server_cert. data . subject_name ( ) ?,
254+ rustls:: sign:: CertifiedKey :: new (
255+ vec ! [
256+ pem:: parse( & server_cert. data. cert) ?
257+ . into_contents( )
258+ . try_into( ) ?,
259+ ] ,
260+ private_key,
261+ ) ,
262+ ) ?;
263+ }
242264 }
243265
244266 Ok ( Self ( RustlsAcceptor :: new ( RustlsConfig :: from_config (
0 commit comments