sql >> Database >  >> RDS >> PostgreSQL

Gebruik PostgreSQL SSL-verbinding in roest met zelfondertekende certificaten

Deze blogpost gaat over het gebruik van de roesttaal om een ​​verbinding te maken met PostgreSQL en YugabyteDB, die wire-compatibel is met postgres en dus ook van toepassing is. Dit is eigenlijk heel eenvoudig:

ongecodeerde eenvoudige postgres-verbinding

Voeg de benodigde krat toe aan Cargo.toml:

postgres = "0.19.2"

En voer de verbinding uit in 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);
}

Verplaats de postgres-krat naar het bereik voor de Client- en NoTls-methoden, maak een verbinding en voer een query uit. Ik heb query_one() gebruikt, die een query uitvoert die een enkele rij zou moeten retourneren.

versleutelde/TLS eenvoudige postgres-verbinding

Het wordt echter interessanter met SSL. Als je een TLS-verbinding met postgres in roest wilt gebruiken, zijn er twee opties:openssl en native_tls. De reden dat ik 'zelfondertekende certificaten' in de titel heb opgenomen is:tot nu toe lijkt het erop dat de native_tls-krat geen zelfondertekende certificaten toestaat. Dit lijkt er voor te zorgen dat sommige mensen beweren dat je geen roest-, postgres- en TLS-verbindingen kunt gebruiken met zelfondertekende certificaten. Dit is niet waar.

Met openssl kan dat. Maakt dat openssl minder veilig? Nee:openssl staat ook standaard niet toe dat zelfondertekende certificaten worden gebruikt. U kunt echter de verificatie voor certificeringsinstanties uitschakelen, zodat niet-officiële (zelfondertekende) certificaten van certificeringsinstanties kunnen worden gebruikt. Dat mag natuurlijk niet in een officiële implementatie die veilig zou moeten zijn. Maar het is prima om dit te doen voor een test- of proof-of-concept-configuratie, zodat u kunt werken met SSL/TLS-verbindingen zonder dat u officieel ondertekende certificaten hoeft te verkrijgen.

Dit is hoe dat gebeurt:
Vracht.toml:

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

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

Het eerste deel bouwt een SSL TLS-connector op basis van een op maat gemaakt certificaat van een certificeringsinstantie en schakelt expliciet de verificatie van het certificaat van de certificeringsinstantie uit. Hierdoor kan het zelfondertekende certificaat worden gebruikt.

Het tweede deel is identiek aan het eerste voorbeeld, behalve dat de TLS-specificatie van de verbinding is gewijzigd van NoTls naar de TLS-connector.


  1. Hoe de MySQL-versie te controleren?

  2. MariaDB-tekenreeksen voor datumnotatie

  3. Wat is de beste manier om te ontsnappen aan niet-opgemaakte tekens in to_char van Oracle?

  4. PostgreSQL VACUUMM en ANALYSE Tips voor beste praktijken