Тази публикация в блога е за използването на езика rust за създаване на връзка с PostgreSQL и YugabyteDB, която е съвместима с postgres и затова е приложима. Това всъщност е изключително просто:
некриптирана проста postgres връзка
Добавете необходимия сандък към Cargo.toml:
postgres = "0.19.2"
И извършете връзката в 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);
}
Преместете postgres щайга в обхвата за методите Client и NoTls, създайте връзка и изпълнете заявка. Използвах query_one(), който изпълнява заявка, която трябва да върне един ред.
криптирана/TLS проста postgres връзка
Въпреки това става по-интересно със SSL. Ако искате да използвате TLS връзка с postgres в rust, има две опции:openssl и native_tls. Причината да включих „самоподписани сертификати“ в заглавието е:засега изглежда, че кутията native_tls не позволява самоподписани сертификати. Това изглежда кара някои хора да заявяват, че не можете да използвате връзки с ръжда, postgres и TLS със самоподписани сертификати. Това не е вярно.
Можете да използвате openssl. Това прави ли openssl по-малко сигурен? Не:openssl също не позволява използването на самоподписани сертификати по подразбиране. Въпреки това ви позволява да деактивирате проверката за сертифициращи органи, така че могат да се използват неофициални (самоподписани) сертификати на сертифициращи органи. Разбира се, това не трябва да се прави при официално изпълнение, което се предполага, че е сигурно. Но е напълно добре да го направите за настройка за тест или доказателство за концепция, така че да можете да работите със SSL/TLS връзки, без да се налага да получавате официално подписани сертификати.
Ето как се прави това:
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);
}
Първата част изгражда SSL TLS конектор въз основа на персонализиран сертификат на сертифициращ орган и изрично изключва проверката на сертификата на сертифициращия орган. Това позволява използването на самоподписания сертификат.
Втората част е идентична с първия пример, с изключение, че TLS спецификацията на връзката е променена от NoTls към TLS конектора.