PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden Sie eine PostgreSQL-SSL-Verbindung in Rust mit selbstsignierten Zertifikaten

In diesem Blogpost geht es darum, die Rust-Sprache zu verwenden, um eine Verbindung zu PostgreSQL und YugabyteDB herzustellen, was Wire-kompatibel mit Postgres ist und daher auch gilt. Das ist eigentlich ganz einfach:

unverschlüsselte einfache Postgres-Verbindung

Fügen Sie die erforderliche Kiste zu Cargo.toml hinzu:

postgres = "0.19.2"

Und führen Sie die Verbindung in main.rs durch:

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);
}

Verschieben Sie die Postgres-Kiste in den Bereich für die Client- und NoTls-Methoden, erstellen Sie eine Verbindung und führen Sie eine Abfrage aus. Ich habe query_one() verwendet, das eine Abfrage ausführt, die eine einzelne Zeile zurückgeben sollte.

verschlüsselte/TLS einfache Postgres-Verbindung

Interessanter wird es jedoch mit SSL. Wenn Sie eine TLS-Verbindung mit Postgres in Rust verwenden möchten, gibt es zwei Möglichkeiten:openssl und native_tls. Der Grund, warum ich „selbstsignierte Zertifikate“ in den Titel aufgenommen habe, ist:Bisher scheint die native_tls-Kiste keine selbstsignierten Zertifikate zuzulassen. Dies scheint einige Leute zu der Aussage zu veranlassen, dass Sie keine Rust-, Postgres- und TLS-Verbindungen mit selbstsignierten Zertifikaten verwenden können. Das ist nicht wahr.

Mit openssl geht das. Macht das openssl weniger sicher? Nein:openssl erlaubt standardmäßig auch nicht die Verwendung von selbstsignierten Zertifikaten. Sie können jedoch die Überprüfung für Zertifizierungsstellen deaktivieren, sodass inoffizielle (selbstsignierte) Zertifizierungsstellenzertifikate verwendet werden können. Das sollte natürlich nicht in einer offiziellen Implementierung geschehen, die sicher sein soll. Für eine Test- oder Proof-of-Concept-Einrichtung ist dies jedoch vollkommen in Ordnung, damit Sie mit SSL/TLS-Verbindungen arbeiten können, ohne offiziell signierte Zertifikate zu erhalten.

So wird das gemacht:
Fracht.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);
}

Der erste Teil erstellt einen SSL-TLS-Connector basierend auf einem benutzerdefinierten Zertifizierungsstellenzertifikat und deaktiviert explizit die Überprüfung des Zertifizierungsstellenzertifikats. Dadurch kann das selbstsignierte Zertifikat verwendet werden.

Der zweite Teil ist identisch mit dem ersten Beispiel, mit der Ausnahme, dass die TLS-Spezifikation der Verbindung von NoTls auf den TLS-Connector geändert wird.