sql >> データベース >  >> RDS >> PostgreSQL

自己署名証明書を使用して、PostgreSQLSSL接続を錆びた状態で使用する

    このブログ投稿は、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を使用するとさらに面白くなります。 rustでpostgresを使用してTLS接続を使用する場合は、opensslとnative_tlsの2つのオプションがあります。タイトルに「自己署名証明書」を含めた理由は次のとおりです。これまでのところ、native_tlsクレートは自己署名証明書を許可していないようです。これにより、一部の人々は、自己署名証明書でrust、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コネクタを構築し、認証局証明書の検証を明示的にオフにします。これにより、自己署名証明書を使用できるようになります。

    2番目の部分は、接続のTLS仕様がNoTlsからTLSコネクタに変更されていることを除いて、最初の例と同じです。


    1. 重複するデータベースクエリを減らすためのデータベースキャッシングの形式はありません。

    2. JPAを使用してJavaDateをMysql日時に保存する方法

    3. 最も高価なクエリをログに記録して見つけるにはどうすればよいですか?

    4. MariaDBの使用