PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Użyj połączenia PostgreSQL SSL w rdzy z certyfikatami z podpisem własnym

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa Extract() w PostgreSQL

  2. Czy PostgreSQL może wykonać łączenie między dwiema procedurami składowanymi SQL Server?

  3. Dodaj miesiące do daty w PostgreSQL

  4. Zrzut Postgres zawierający tylko części tabel dla migawki dewelopera

  5. Napraw „BŁĄD:każde zapytanie Z WYJĄTKIEM musi mieć taką samą liczbę kolumn” w PostgreSQL