sql >> Databáze >  >> RDS >> PostgreSQL

Použijte PostgreSQL SSL připojení v rezu s certifikáty podepsanými sebou samým

Tento blogpost je o použití jazyka rust k vytvoření připojení k PostgreSQL a YugabyteDB, které je drátově kompatibilní s postgres, takže platí také. To je vlastně velmi jednoduché:

nešifrované jednoduché postgresové připojení

Přidejte potřebnou přepravku na Cargo.toml:

postgres = "0.19.2"

A proveďte připojení v 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);
}

Přesuňte bednu postgres do oboru pro metody Client a NoTls, vytvořte připojení a spusťte dotaz. Použil jsem query_one(), který provede dotaz, který by měl vrátit jeden řádek.

šifrované/TLS jednoduché postgresové připojení

S SSL je to však zajímavější. Pokud chcete použít TLS spojení s postgres v rust, existují dvě možnosti:openssl a native_tls. Důvod, proč jsem do názvu zahrnul 'certifikáty s vlastním podpisem' je:zatím se zdá, že bedna native_tls nepovoluje certifikáty s vlastním podpisem. Zdá se, že to způsobuje, že někteří lidé tvrdí, že nemůžete používat připojení rust, postgres a TLS s certifikáty s vlastním podpisem. To není pravda.

Pomocí openssl můžete. Dělá to openssl méně bezpečným? Ne:openssl také ve výchozím nastavení neumožňuje použití certifikátů s vlastním podpisem. Umožňuje vám však zakázat ověřování pro certifikační autority, takže lze používat neoficiální certifikáty certifikačních autorit (s vlastním podpisem). To by se samozřejmě nemělo dělat v oficiální implementaci, která má být bezpečná. Ale je to naprosto v pořádku, když to uděláte pro testovací nebo proof-of-concept nastavení, takže můžete používat připojení SSL/TLS, aniž byste museli získat oficiálně podepsané certifikáty.

Takto se to dělá:
Cargo.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);
}

První část vytváří konektor SSL TLS na základě vlastního vytvořeného certifikátu certifikační autority a explicitně vypíná ověřování certifikátu certifikační autority. To umožňuje použití certifikátu s vlastním podpisem.

Druhá část je shodná s prvním příkladem s tou výjimkou, že TLS specifikace připojení je změněna z NoTls na TLS konektor.


  1. Enterprise Manager 11g FMW Control v R12.2

  2. Chyba SQLiteDatabase sqlite:(1) blízko ):chyba syntaxe

  3. Volání uložené procedury Java v programu Java

  4. Důležitá změna Extended Events v SQL Server 2012