sql >> Base de Datos >  >> RDS >> PostgreSQL

Use la conexión PostgreSQL SSL en rust con certificados autofirmados

Esta publicación de blog trata sobre el uso del lenguaje rust para crear una conexión con PostgreSQL y YugabyteDB, que es compatible con cables con postgres, por lo que también se aplica. Esto es realmente extremadamente simple:

conexión postgres simple sin cifrar

Agregue la caja necesaria a Cargo.toml:

postgres = "0.19.2"

Y realiza la conexión en 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);
}

Mueva la caja de postgres al alcance de los métodos Client y NoTls, cree una conexión y ejecute una consulta. Usé query_one(), que ejecuta una consulta que debería devolver una sola fila.

conexión postgres simple cifrada/TLS

Sin embargo, se vuelve más interesante con SSL. Si desea utilizar una conexión TLS con postgres en rust, hay dos opciones:openssl y native_tls. La razón por la que incluí 'certificados autofirmados' en el título es:hasta ahora, parece que la caja native_tls no permite certificados autofirmados. Esto parece hacer que algunas personas afirmen que no se pueden usar conexiones rust, postgres y TLS con certificados autofirmados. Esto no es cierto.

Usando openssl puedes. ¿Eso hace que openssl sea menos seguro? No:openssl tampoco permite el uso predeterminado de certificados autofirmados. Sin embargo, le permite deshabilitar la verificación para las autoridades de certificación, por lo que se pueden usar certificados de autoridad de certificación no oficiales (autofirmados). Por supuesto, eso no debe hacerse en una implementación oficial que se supone que es segura. Pero está perfectamente bien hacerlo para una configuración de prueba o prueba de concepto para que pueda ejecutar conexiones SSL/TLS sin necesidad de obtener certificados firmados oficialmente.

Así es como se hace:
Cargo.toml:

postgres = "0.19.2"
openssl = "0.10.38"
postgres-openssl = "0.5.0"

principal.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);
}

La primera parte crea un conector SSL TLS basado en un certificado de autoridad certificadora creado de forma personalizada y desactiva explícitamente la verificación del certificado de autoridad certificadora. Esto es lo que permite usar el certificado autofirmado.

La segunda parte es idéntica al primer ejemplo, con la excepción de que la especificación TLS de la conexión se cambia de NoTls al conector TLS.