@@ -22,10 +22,10 @@ impl Postgres {
22
22
}
23
23
}
24
24
25
- const CERT_URL : & str = "https://s3. amazonaws.com/rds-downloads/rds-ca-2019-root .pem" ;
25
+ const CERT_URL : & str = "https://truststore.pki.rds. amazonaws.com/global/global-bundle .pem" ;
26
26
27
27
lazy_static:: lazy_static! {
28
- static ref CERTIFICATE_PEM : Vec <u8 > = {
28
+ static ref CERTIFICATE_PEMS : Vec <u8 > = {
29
29
let client = reqwest:: blocking:: Client :: new( ) ;
30
30
let resp = client
31
31
. get( CERT_URL )
@@ -37,12 +37,11 @@ lazy_static::lazy_static! {
37
37
38
38
async fn make_client ( db_url : & str ) -> anyhow:: Result < tokio_postgres:: Client > {
39
39
if db_url. contains ( "rds.amazonaws.com" ) {
40
- let cert = & CERTIFICATE_PEM [ ..] ;
41
- let cert = Certificate :: from_pem ( cert) . context ( "made certificate" ) ?;
42
- let connector = TlsConnector :: builder ( )
43
- . add_root_certificate ( cert)
44
- . build ( )
45
- . context ( "built TlsConnector" ) ?;
40
+ let mut builder = TlsConnector :: builder ( ) ;
41
+ for cert in make_certificates ( ) {
42
+ builder. add_root_certificate ( cert) ;
43
+ }
44
+ let connector = builder. build ( ) . context ( "built TlsConnector" ) ?;
46
45
let connector = MakeTlsConnector :: new ( connector) ;
47
46
48
47
let ( db_client, connection) = match tokio_postgres:: connect ( db_url, connector) . await {
@@ -76,6 +75,16 @@ async fn make_client(db_url: &str) -> anyhow::Result<tokio_postgres::Client> {
76
75
Ok ( db_client)
77
76
}
78
77
}
78
+ fn make_certificates ( ) -> Vec < Certificate > {
79
+ use x509_cert:: der:: pem:: LineEnding ;
80
+ use x509_cert:: der:: EncodePem ;
81
+
82
+ let certs = x509_cert:: Certificate :: load_pem_chain ( & CERTIFICATE_PEMS [ ..] ) . unwrap ( ) ;
83
+ certs
84
+ . into_iter ( )
85
+ . map ( |cert| Certificate :: from_pem ( cert. to_pem ( LineEnding :: LF ) . unwrap ( ) . as_bytes ( ) ) . unwrap ( ) )
86
+ . collect ( )
87
+ }
79
88
80
89
static MIGRATIONS : & [ & str ] = & [
81
90
"" ,
@@ -1349,3 +1358,16 @@ fn parse_artifact_id(ty: &str, sha: &str, date: Option<DateTime<Utc>>) -> Artifa
1349
1358
_ => panic ! ( "unknown artifact type: {:?}" , ty) ,
1350
1359
}
1351
1360
}
1361
+
1362
+ #[ cfg( test) ]
1363
+ mod tests {
1364
+ use super :: make_certificates;
1365
+
1366
+ // Makes sure we successfully parse the RDS certificates and load them into native-tls compatible
1367
+ // format.
1368
+ #[ test]
1369
+ fn can_make_certificates ( ) {
1370
+ let certs = make_certificates ( ) ;
1371
+ assert ! ( !certs. is_empty( ) ) ;
1372
+ }
1373
+ }
0 commit comments