Ten wpis na blogu dotyczy używania języka rdzy do tworzenia połączenia z PostgreSQL i YugabyteDB, które jest kompatybilne z postgresem, dlatego też ma zastosowanie. To jest naprawdę bardzo proste:
niezaszyfrowane proste połączenie Postgres
Dodaj niezbędną skrzynię do Cargo.toml:
postgres = "0.19.2"
I wykonaj połączenie w 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);
}
Przenieś skrzynię postgres do zakresu metod Client i NoTls, utwórz połączenie i wykonaj zapytanie. Użyłem query_one(), który wykonuje zapytanie, które powinno zwrócić pojedynczy wiersz.
szyfrowane/proste połączenie postgresowe TLS
Jednak z SSL robi się ciekawiej. Jeśli chcesz użyć połączenia TLS z postgresem w rdzy, masz dwie opcje:openssl i native_tls. Powodem, dla którego umieściłem w tytule „certyfikaty z podpisem własnym”, jest:jak dotąd wydaje się, że skrzynka native_tls nie zezwala na certyfikaty z podpisem własnym. Wydaje się, że niektórzy twierdzą, że nie można używać połączeń rdzy, postgres i TLS z certyfikatami z podpisem własnym. To nieprawda.
Używając openssl możesz. Czy to sprawia, że openssl jest mniej bezpieczny? Nie:openssl nie zezwala również domyślnie na używanie certyfikatów z podpisem własnym. Umożliwia jednak wyłączenie weryfikacji dla urzędów certyfikacji, dzięki czemu można używać nieoficjalnych (samopodpisanych) certyfikatów urzędów certyfikacji. Oczywiście nie powinno się tego robić w oficjalnej implementacji, która ma być bezpieczna. Ale jest to całkowicie w porządku w przypadku konfiguracji testowej lub weryfikacji koncepcji, dzięki czemu można uruchomić z połączeniami SSL/TLS bez konieczności uzyskiwania oficjalnie podpisanych certyfikatów.
Tak to się robi:
Ładunek.toml:
postgres = "0.19.2"
openssl = "0.10.38"
postgres-openssl = "0.5.0"
główne.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);
}
Pierwsza część buduje łącznik SSL TLS w oparciu o niestandardowy certyfikat urzędu certyfikacji i wyraźnie wyłącza weryfikację certyfikatu urzędu certyfikacji. To właśnie pozwala na użycie certyfikatu z podpisem własnym.
Druga część jest identyczna z pierwszym przykładem, z wyjątkiem tego, że specyfikacja TLS połączenia została zmieniona z NoTls na złącze TLS.