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.