PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Utiliser la connexion SSL PostgreSQL dans Rust avec des certificats auto-signés

Ce billet de blog concerne l'utilisation du langage rouille pour créer une connexion à PostgreSQL et YugabyteDB, qui est compatible avec postgres et s'applique donc également. C'est en fait extrêmement simple :

connexion postgres simple non chiffrée

Ajoutez la caisse nécessaire à Cargo.toml :

postgres = "0.19.2"

Et effectuez la connexion dans main.rs :

use postgres::{Client, NoTls};

fn main() {
    // no SSL/TLS
    let mut connection = Client::connect("host=192.168.66.201 port=5432 user=postgres password=postgres", NoTls).expect("failed to create notls postgres connection");
    let result = connection.query_one("select 10", &[]).expect("failed to execute select 10 to postgres");
    let value: i32 = result.get(0);
    println!("result of query_one call: {}", value);
}

Déplacez le crate postgres dans la portée des méthodes Client et NoTls, créez une connexion et exécutez une requête. J'ai utilisé query_one(), qui exécute une requête qui doit renvoyer une seule ligne.

connexion postgres simple cryptée/TLS

Cependant, cela devient plus intéressant avec SSL. Si vous souhaitez utiliser une connexion TLS avec postgres dans rust, il y a deux options :openssl et native_tls. La raison pour laquelle j'ai inclus "certificats auto-signés" dans le titre est la suivante :jusqu'à présent, il semble que la caisse native_tls n'autorise pas les certificats auto-signés. Cela semble amener certaines personnes à déclarer que vous ne pouvez pas utiliser les connexions rust, postgres et TLS avec des certificats auto-signés. Ce n'est pas vrai.

En utilisant openssl, vous pouvez. Cela rend-il openssl moins sécurisé ? Non :openssl n'autorise pas non plus l'utilisation de certificats auto-signés par défaut. Cependant, il vous permet de désactiver la vérification des autorités de certification, de sorte que des certificats d'autorité de certification non officiels (auto-signés) peuvent être utilisés. Bien sûr, cela ne devrait pas être fait dans une implémentation officielle censée être sécurisée. Mais c'est parfaitement bien de le faire pour une configuration de test ou de preuve de concept afin que vous puissiez fonctionner avec des connexions SSL/TLS sans avoir besoin d'obtenir des certificats officiellement signés.

Voici comment cela se fait :
Cargaison.toml :

postgres = "0.19.2"
openssl = "0.10.38"
postgres-openssl = "0.5.0"

main.rs :

fn main() {
    let mut builder = SslConnector::builder(SslMethod::tls()).expect("unable to create sslconnector builder");
    builder.set_ca_file("/tmp/ca.cert").expect("unable to load ca.cert");
    builder.set_verify(SslVerifyMode::NONE);
    let connector = MakeTlsConnector::new(builder.build());

    let mut connection = Client::connect("host=192.168.66.201 port=5432 sslmode=require user=postgres password=postgres", connector).expect("failed to create tls postgres connection");
    let result = connection.query_one("select 10", &[]).expect("failed to execute select 10 to postgres");
    let value: i32 = result.get(0);
    println!("result of query_one call: {}", value);
}

La première partie crée un connecteur SSL TLS basé sur un certificat d'autorité de certification personnalisé et désactive explicitement la vérification du certificat de l'autorité de certification. C'est ce qui permet d'utiliser le certificat auto-signé.

La deuxième partie est identique au premier exemple, à l'exception que la spécification TLS de la connexion est modifiée de NoTls au connecteur TLS.