sql >> Database teknologi >  >> RDS >> PostgreSQL

Brug PostgreSQL SSL-forbindelse i rust med selvsignerede certifikater

Dette blogindlæg handler om at bruge rustsproget til at skabe en forbindelse til PostgreSQL og YugabyteDB, som er wire-kompatibel med postgres, så derfor også gælder. Dette er faktisk ekstremt simpelt:

ukrypteret simpel postgres-forbindelse

Tilføj den nødvendige kasse til Cargo.toml:

postgres = "0.19.2"

Og udfør forbindelsen i 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);
}

Flyt postgres-kassen ind i anvendelsesområdet for Client- og NoTls-metoderne, opret en forbindelse, og udfør en forespørgsel. Jeg brugte query_one(), som udfører en forespørgsel, der skulle returnere en enkelt række.

krypteret/TLS enkel postgres-forbindelse

Det bliver dog mere interessant med SSL. Hvis du vil bruge en TLS-forbindelse med postgres i rust, er der to muligheder:openssl og native_tls. Grunden til, at jeg inkluderede 'selvsignerede certifikater' i titlen er:indtil videre ser det ud til, at native_tls-kassen ikke tillader selvsignerede certifikater. Dette ser ud til at få nogle til at sige, at du ikke kan bruge rust-, postgres- og TLS-forbindelser med selvsignerede certifikater. Dette er ikke sandt.

Ved at bruge openssl kan du. Gør det openssl mindre sikkert? Nej:openssl tillader heller ikke, at selvsignerede certifikater bruges som standard. Det giver dig dog mulighed for at deaktivere verifikationen for certifikatmyndigheder, så uofficielle (selvsignerede) certifikatmyndigheder kan bruges. Det skal selvfølgelig ikke gøres i en officiel implementering, der formodes at være sikker. Men det er helt fint at gøre det til en test eller proof-of-concept-opsætning, så du kan køre med SSL/TLS-forbindelser uden at skulle anskaffe officielt signerede certifikater.

Sådan gøres det:
Cargo.toml:

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

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

Den første del bygger en SSL TLS-konnektor baseret på et brugerdefineret oprettet certifikatmyndighedscertifikat, og deaktiverer eksplicit verifikationen af ​​certifikatmyndighedens certifikat. Det er det, der gør det muligt at bruge det selvsignerede certifikat.

Den anden del er identisk med det første eksempel med den undtagelse, at TLS-specifikationen af ​​forbindelsen ændres fra NoTls til TLS-stikket.


  1. Hvordan bruger jeg alias i where-klausulen?

  2. Aktiver Database Mail i SQL Server (T-SQL)

  3. ORACLE Sådan bruges spole med dynamisk spoleplacering

  4. Oracle Datatyper