PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sử dụng kết nối SSL PostgreSQL không gỉ với chứng chỉ tự ký

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để trích xuất năm và tháng từ ngày trong PostgreSQL mà không sử dụng hàm to_char ()?

  2. Bảng postgresql tồn tại, nhưng mối quan hệ nhận được không tồn tại khi truy vấn

  3. Bản ghi trả về từ hàm có các cột được nối với nhau

  4. Oracle đến PostgreSQL:Cú pháp nối ngoài ANSI trong PostgreSQL

  5. Tìm các bản ghi mà sự tham gia không tồn tại