@@ -13,7 +13,7 @@ use asyncs::select;
13
13
use pretty_assertions:: assert_eq;
14
14
use rand:: distributions:: Standard ;
15
15
use rand:: Rng ;
16
- use rcgen:: { Certificate , CertificateParams } ;
16
+ use rcgen:: { Certificate , CertificateParams , Issuer , KeyPair } ;
17
17
#[ allow( unused_imports) ]
18
18
use tempfile:: { tempdir, TempDir } ;
19
19
use test_case:: test_case;
@@ -221,42 +221,41 @@ struct Tls {
221
221
impl Tls {
222
222
fn new ( dir : Arc < TempDir > ) -> Self {
223
223
let hostname_verification = env_toggle ( "ZK_TLS_HOSTNAME_VERIFICATION" ) ;
224
- let ( ca_cert, ca_cert_pem) = generate_ca_cert ( ) ;
225
- let server_cert = generate_server_cert ( hostname_verification) ;
226
- let signed_server_cert = server_cert. serialize_pem_with_signer ( & ca_cert) . unwrap ( ) ;
227
-
228
- // ZooKeeper needs a keystore with both key and signed cert.
229
- let server_pem = server_cert. serialize_private_key_pem ( ) + & signed_server_cert;
230
224
225
+ let ( ca_issuer, ca_cert) = generate_ca_cert ( ) ;
226
+ let ca_cert_pem = ca_cert. pem ( ) ;
231
227
let ca_cert_file = dir. path ( ) . join ( "ca.cert.pem" ) ;
232
228
fs:: write ( & ca_cert_file, & ca_cert_pem) . unwrap ( ) ;
233
229
230
+ let ( server_cert, server_key) = generate_server_cert ( hostname_verification, & ca_issuer) ;
231
+
232
+ // ZooKeeper needs a keystore with both key and signed cert.
233
+ let server_pem = server_key. serialize_pem ( ) + & server_cert. pem ( ) ;
234
+
234
235
let server_pem_file = dir. path ( ) . join ( "server.pem" ) ;
235
236
fs:: write ( & server_pem_file, & server_pem) . unwrap ( ) ;
236
237
237
- let client_cert = generate_client_cert ( "client" ) ;
238
- let signed_client_cert = client_cert. serialize_pem_with_signer ( & ca_cert ) . unwrap ( ) ;
239
- let client_key = client_cert . serialize_private_key_pem ( ) ;
240
- let client_pem = client_key . clone ( ) + & signed_client_cert ;
238
+ let ( client_cert, client_key ) = generate_client_cert ( "client" , & ca_issuer ) ;
239
+ let client_cert_pem = client_cert. pem ( ) ;
240
+ let client_key_pem = client_key . serialize_pem ( ) ;
241
+ let client_pem = client_key_pem . clone ( ) + & client_cert_pem ;
241
242
242
243
let client_pem_file = dir. path ( ) . join ( "client.pem" ) ;
243
244
fs:: write ( & client_pem_file, & client_pem) . unwrap ( ) ;
244
245
245
- let client_cert_x = generate_client_cert ( "client_x" ) ;
246
- let signed_client_cert_x = client_cert_x. serialize_pem_with_signer ( & ca_cert) . unwrap ( ) ;
247
- let client_key_x = client_cert_x. serialize_private_key_pem ( ) ;
246
+ let ( client_x_cert, client_x_key) = generate_client_cert ( "client_x" , & ca_issuer) ;
248
247
249
248
Self {
250
249
_dir : dir,
251
250
_ca_cert : ca_cert,
252
251
ca_cert_pem,
253
252
ca_cert_file,
254
253
server_identity_file : server_pem_file,
255
- client_cert_pem : signed_client_cert ,
256
- client_cert_key : client_key ,
254
+ client_cert_pem,
255
+ client_cert_key : client_key_pem ,
257
256
client_identity_file : client_pem_file,
258
- client_x_cert_pem : signed_client_cert_x ,
259
- client_x_cert_key : client_key_x ,
257
+ client_x_cert_pem : client_x_cert . pem ( ) ,
258
+ client_x_cert_key : client_x_key . serialize_pem ( ) ,
260
259
hostname_verification,
261
260
}
262
261
}
@@ -1894,32 +1893,41 @@ Server {
1894
1893
}
1895
1894
1896
1895
#[ allow( dead_code) ]
1897
- fn generate_ca_cert ( ) -> ( Certificate , String ) {
1896
+ fn generate_ca_cert ( ) -> ( Issuer < ' static , KeyPair > , Certificate ) {
1898
1897
let mut params = CertificateParams :: default ( ) ;
1899
1898
params. is_ca = rcgen:: IsCa :: Ca ( rcgen:: BasicConstraints :: Unconstrained ) ;
1900
1899
params. distinguished_name . push ( rcgen:: DnType :: CommonName , "ca" ) ;
1901
- let ca_cert = Certificate :: from_params ( params) . unwrap ( ) ;
1902
- let ca_cert_pem = ca_cert. serialize_pem ( ) . unwrap ( ) ;
1903
- let ca_cert_key = rcgen:: KeyPair :: from_pem ( & ca_cert. get_key_pair ( ) . serialize_pem ( ) ) . unwrap ( ) ;
1904
- let ca_cert_params = CertificateParams :: from_ca_cert_pem ( & ca_cert_pem, ca_cert_key) . unwrap ( ) ;
1905
- ( Certificate :: from_params ( ca_cert_params) . unwrap ( ) , ca_cert_pem)
1900
+ params. key_usages = vec ! [
1901
+ rcgen:: KeyUsagePurpose :: KeyCertSign ,
1902
+ rcgen:: KeyUsagePurpose :: DigitalSignature ,
1903
+ rcgen:: KeyUsagePurpose :: CrlSign ,
1904
+ ] ;
1905
+ let key = KeyPair :: generate ( ) . unwrap ( ) ;
1906
+ let ca_cert = params. self_signed ( & key) . unwrap ( ) ;
1907
+ let ca_issuer = Issuer :: from_ca_cert_der ( ca_cert. der ( ) , key) . unwrap ( ) ;
1908
+ ( ca_issuer, ca_cert)
1906
1909
}
1907
1910
1908
1911
#[ allow( dead_code) ]
1909
- fn generate_server_cert ( hostname_verification : bool ) -> Certificate {
1912
+ fn generate_server_cert ( hostname_verification : bool , issuer : & Issuer < ' _ , KeyPair > ) -> ( Certificate , KeyPair ) {
1910
1913
let san = if hostname_verification { vec ! [ "127.0.0.1" . to_string( ) ] } else { vec ! [ ] } ;
1911
- let mut params = CertificateParams :: new ( san) ;
1914
+ let mut params = CertificateParams :: new ( san) . unwrap ( ) ;
1912
1915
params. key_usages = vec ! [ rcgen:: KeyUsagePurpose :: DigitalSignature , rcgen:: KeyUsagePurpose :: KeyEncipherment ] ;
1913
1916
params. extended_key_usages = vec ! [ rcgen:: ExtendedKeyUsagePurpose :: ServerAuth ] ;
1914
1917
params. distinguished_name . push ( rcgen:: DnType :: CommonName , "server" ) ;
1915
- Certificate :: from_params ( params) . unwrap ( )
1918
+
1919
+ let key = KeyPair :: generate ( ) . unwrap ( ) ;
1920
+ let cert = params. signed_by ( & key, issuer) . unwrap ( ) ;
1921
+ ( cert, key)
1916
1922
}
1917
1923
1918
1924
#[ allow( dead_code) ]
1919
- fn generate_client_cert ( cn : & str ) -> Certificate {
1925
+ fn generate_client_cert ( cn : & str , issuer : & Issuer < ' _ , KeyPair > ) -> ( Certificate , KeyPair ) {
1920
1926
let mut params = CertificateParams :: default ( ) ;
1921
1927
params. distinguished_name . push ( rcgen:: DnType :: CommonName , cn) ;
1922
- Certificate :: from_params ( params) . unwrap ( )
1928
+ let key = KeyPair :: generate ( ) . unwrap ( ) ;
1929
+ let cert = params. signed_by ( & key, issuer) . unwrap ( ) ;
1930
+ ( cert, key)
1923
1931
}
1924
1932
1925
1933
#[ cfg( feature = "tls" ) ]
0 commit comments