Bài đăng blog này nói về việc sử dụng ngôn ngữ gỉ để tạo kết nối với PostgreSQL và YugabyteDB, tương thích với dây với postgres, do đó cũng áp dụng. Điều này thực sự cực kỳ đơn giản:
kết nối postgres đơn giản không được mã hóa
Thêm thùng cần thiết vào Cargo.toml:
postgres = "0.19.2"
Và thực hiện kết nối trong 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);
}
Di chuyển thùng postgres vào phạm vi cho các phương thức Client và NoTls, tạo kết nối và thực hiện truy vấn. Tôi đã sử dụng query_one (), thực thi một truy vấn sẽ trả về một hàng.
kết nối postgres đơn giản được mã hóa / TLS
Tuy nhiên, nó trở nên thú vị hơn với SSL. Nếu bạn muốn sử dụng kết nối TLS với postgres trong gỉ, có hai tùy chọn:openssl và native_tls. Lý do tôi đưa 'chứng chỉ tự ký' vào tiêu đề là:cho đến nay, có vẻ như thùng native_tls không cho phép chứng chỉ tự ký. Điều này dường như khiến một số người nói rằng bạn không thể sử dụng kết nối gỉ, postgres và TLS với các chứng chỉ tự ký. Điều này không đúng.
Bạn có thể sử dụng openssl. Điều đó có làm cho openssl kém an toàn hơn không? Không:openssl cũng không cho phép sử dụng chứng chỉ tự ký theo mặc định. Tuy nhiên, nó cho phép bạn vô hiệu hóa xác minh đối với tổ chức phát hành chứng chỉ, do đó, các chứng chỉ tổ chức cấp chứng chỉ không chính thức (tự ký) có thể được sử dụng. Tất nhiên điều đó không nên được thực hiện trong một triển khai chính thức được cho là an toàn. Nhưng hoàn toàn tốt nếu làm như vậy đối với thiết lập thử nghiệm hoặc bằng chứng khái niệm để bạn có thể chạy với các kết nối SSL / TLS mà không yêu cầu phải có chứng chỉ đã ký chính thức.
Đây là cách được thực hiện:
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);
}
Phần đầu tiên xây dựng trình kết nối SSL TLS dựa trên chứng chỉ của tổ chức phát hành chứng chỉ được tạo tùy chỉnh và tắt xác minh chứng chỉ của tổ chức phát hành chứng chỉ một cách rõ ràng. Đây là điều cho phép sử dụng chứng chỉ tự ký.
Phần thứ hai giống với ví dụ đầu tiên, ngoại trừ đặc điểm kỹ thuật TLS của kết nối được thay đổi từ NoTls thành trình kết nối TLS.