@@ -2,8 +2,8 @@ use std::time::SystemTime;
2
2
3
3
use anyhow:: { Context , Result } ;
4
4
use rcgen:: {
5
- Certificate , CertificateParams , DnType , ExtendedKeyUsagePurpose , KeyPair , KeyUsagePurpose ,
6
- SignatureAlgorithm ,
5
+ Certificate , CertificateParams , DnType , ExtendedKeyUsagePurpose , Issuer , KeyPair ,
6
+ KeyUsagePurpose , SignatureAlgorithm ,
7
7
} ;
8
8
use tokio:: fs;
9
9
use uuid:: Uuid ;
@@ -16,8 +16,7 @@ fn gen_client_cert(
16
16
id : & str ,
17
17
not_before : SystemTime ,
18
18
not_after : SystemTime ,
19
- issuer : & Certificate ,
20
- issuer_key : & KeyPair ,
19
+ issuer : & Issuer < ' static , KeyPair > ,
21
20
) -> Result < ( Certificate , KeyPair ) > {
22
21
let mut params = CertificateParams :: new ( vec ! [ id. to_string( ) ] ) ?;
23
22
params
@@ -32,10 +31,13 @@ fn gen_client_cert(
32
31
. push ( ExtendedKeyUsagePurpose :: ClientAuth ) ;
33
32
34
33
let kp = KeyPair :: generate ( ) ?;
35
- Ok ( ( params. signed_by ( & kp, issuer, issuer_key ) ?, kp) )
34
+ Ok ( ( params. signed_by ( & kp, issuer) ?, kp) )
36
35
}
37
36
38
- async fn get_ca_cert ( ca_cert_file : & str , ca_key_file : & str ) -> Result < ( Certificate , KeyPair ) > {
37
+ async fn get_ca_cert (
38
+ ca_cert_file : & str ,
39
+ ca_key_file : & str ,
40
+ ) -> Result < ( String , Issuer < ' static , KeyPair > ) > {
39
41
let ca_cert_s = fs:: read_to_string ( ca_cert_file)
40
42
. await
41
43
. context ( "Read gateway ca_cert" ) ?;
@@ -47,44 +49,35 @@ async fn get_ca_cert(ca_cert_file: &str, ca_key_file: &str) -> Result<(Certifica
47
49
48
50
let ca_key =
49
51
KeyPair :: from_pem_and_sign_algo ( & ca_key_s, ca_key_algo) . context ( "Parse gateway CA key" ) ?;
50
- let params =
51
- CertificateParams :: from_ca_cert_pem ( & ca_cert_s) . context ( "Parse gateway CA certificate" ) ?;
52
52
53
- Ok ( ( params. self_signed ( & ca_key) ?, ca_key) )
53
+ Ok ( (
54
+ ca_cert_s. clone ( ) ,
55
+ Issuer :: from_ca_cert_pem ( & ca_cert_s, ca_key) ?,
56
+ ) )
54
57
}
55
58
56
59
// This returns the CA, certificate and private-key as PEM encoded strings.
57
60
pub async fn client_cert_for_gateway_id (
58
61
gateway_id : & EUI64 ,
59
62
) -> Result < ( SystemTime , String , String , String ) > {
60
63
let conf = config:: get ( ) ;
61
- let ( ca_cert, ca_key ) = get_ca_cert ( & conf. gateway . ca_cert , & conf. gateway . ca_key )
64
+ let ( ca_cert, ca_issuer ) = get_ca_cert ( & conf. gateway . ca_cert , & conf. gateway . ca_key )
62
65
. await
63
66
. context ( "Get CA cert" ) ?;
64
67
let not_before = SystemTime :: now ( ) ;
65
68
let not_after = SystemTime :: now ( ) + conf. gateway . client_cert_lifetime ;
66
- let ( gw_cert, gw_key) = gen_client_cert (
67
- & gateway_id. to_string ( ) ,
68
- not_before,
69
- not_after,
70
- & ca_cert,
71
- & ca_key,
72
- )
73
- . context ( "Generate client certificate" ) ?;
69
+ let ( gw_cert, gw_key) =
70
+ gen_client_cert ( & gateway_id. to_string ( ) , not_before, not_after, & ca_issuer)
71
+ . context ( "Generate client certificate" ) ?;
74
72
75
- Ok ( (
76
- not_after,
77
- ca_cert. pem ( ) ,
78
- gw_cert. pem ( ) ,
79
- gw_key. serialize_pem ( ) ,
80
- ) )
73
+ Ok ( ( not_after, ca_cert, gw_cert. pem ( ) , gw_key. serialize_pem ( ) ) )
81
74
}
82
75
83
76
pub async fn client_cert_for_application_id (
84
77
application_id : & Uuid ,
85
78
) -> Result < ( SystemTime , String , String , String ) > {
86
79
let conf = config:: get ( ) ;
87
- let ( ca_cert, ca_key ) = get_ca_cert (
80
+ let ( ca_cert, ca_issuer ) = get_ca_cert (
88
81
& conf. integration . mqtt . client . ca_cert ,
89
82
& conf. integration . mqtt . client . ca_key ,
90
83
)
@@ -95,16 +88,10 @@ pub async fn client_cert_for_application_id(
95
88
& application_id. to_string ( ) ,
96
89
not_before,
97
90
not_after,
98
- & ca_cert,
99
- & ca_key,
91
+ & ca_issuer,
100
92
) ?;
101
93
102
- Ok ( (
103
- not_after,
104
- ca_cert. pem ( ) ,
105
- app_cert. pem ( ) ,
106
- app_key. serialize_pem ( ) ,
107
- ) )
94
+ Ok ( ( not_after, ca_cert, app_cert. pem ( ) , app_key. serialize_pem ( ) ) )
108
95
}
109
96
110
97
// we are using String here, because else we run into lifetime issues.
0 commit comments