PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Use a conexão SSL do PostgreSQL em ferrugem com certificados autoassinados


Esta postagem de blog é sobre como usar a linguagem rust para criar uma conexão com PostgreSQL e YugabyteDB, que é compatível com o postgres, portanto, também se aplica. Na verdade, isso é extremamente simples:

conexão postgres simples não criptografada


Adicione a caixa necessária ao Cargo.toml:

postgres = "0.19.2"

E execute a conexão em 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);
}

Mova a caixa postgres para o escopo dos métodos Client e NoTls, crie uma conexão e execute uma consulta. Eu usei query_one(), que executa uma consulta que deve retornar uma única linha.

conexão postgres simples criptografada/TLS


No entanto, fica mais interessante com SSL. Se você quiser usar uma conexão TLS com postgres em ferrugem, existem duas opções:openssl e native_tls. A razão pela qual incluí 'certificados autoassinados' no título é:até agora, parece que a grade native_tls não permite certificados autoassinados. Isso parece fazer com que algumas pessoas afirmem que você não pode usar conexões rust, postgres e TLS com certificados autoassinados. Isso não é verdade.

Usando openssl você pode. Isso torna o openssl menos seguro? Não:o openssl também não permite que certificados autoassinados sejam usados ​​por padrão. No entanto, ele permite que você desative a verificação para autoridades de certificação, para que certificados de autoridade de certificação não oficiais (autoassinados) possam ser usados. Claro que isso não deve ser feito em uma implementação oficial que deveria ser segura. Mas não há problema em fazer isso para uma configuração de teste ou prova de conceito para que você possa executar com conexões SSL/TLS sem precisar obter certificados assinados oficialmente.

É assim que é feito:
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);
}

A primeira parte cria um conector SSL TLS com base em um certificado de autoridade de certificação criado personalizado e desativa explicitamente a verificação do certificado de autoridade de certificação. É isso que permite que o certificado autoassinado seja usado.

A segunda parte é idêntica ao primeiro exemplo, com a exceção de que a especificação TLS da conexão é alterada de NoTls para o conector TLS.