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

SSL/TLS暗号化を使用してDigitalOcean上のマネージドPostgresサーバーに接続するように`DataSource`を構成します

    データソースの取得 実装

    通常、JDBCドライバー javax.sql.DataSource

    詳細については、私の回答 をご覧ください。 同様の質問に。

    PGSimpleDataSource

    jdbc.postgresql.org のJDBCドライバーを使用する場合 、org.postgresql.dsを使用できます.PGSimpleDataSource DataSourceとしてのクラス 実装。

    タイプPGSimpleDataSourceのオブジェクトをインスタンス化します 次に、setterメソッドを呼び出して、データベースサーバーへの接続に必要なすべての情報を提供します。 DigitalOceanサイトのWebページには、特定のデータベースインスタンスに関するこれらすべての情報が一覧表示されています。

    基本的にこれ:

    PGSimpleDataSource dataSource = new PGSimpleDataSource();
    
    dataSource.setServerName( "your-server-address-goes-here" );
    dataSource.setPortNumber( your-port-number-goes-here );
    dataSource.setDatabaseName( "defaultdb" );
    dataSource.setUser( "doadmin" );
    dataSource.setPassword( "your-password-goes-here" );
    

    複数のサーバー名とポート番号

    残念ながら、メソッドの単一バージョン setServerName およびsetPortNumber 非推奨です。煩わしいですが、おそらくこれらのメソッドの複数形を使用する必要があります( setServerNames setPortNumbers )それぞれが配列を取ります。単一要素配列のペアString[]を設定します およびint[] 、サーバーのアドレスとポート番号 配列リテラルの使用:

    • {"your-server-address-goes-here"}
    • {your-port-number-goes-here}
    PGSimpleDataSource dataSource = new PGSimpleDataSource();
    
    String[] serverAddresses = { "your-server-address-goes-here" };
    dataSource.setServerNames( serverAddresses );
    int[] serverPortNumbers = { your-port-number-goes-here };
    dataSource.setPortNumbers( serverPortNumbers );
    dataSource.setDatabaseName( "defaultdb" );
    dataSource.setUser( "doadmin" );
    dataSource.setPassword( "your-password-goes-here" );
    

    SSL/TLS暗号化

    最後に、質問で取り上げたSSL/TLS暗号化の情報を追加する必要があります。

    皮肉なことに、しない setSsl(true)を呼び出します

    setSsl メソッドとパスtrue 。しかし、違います。直感に反しますが、これをtrueに設定すると、接続が失敗します。理由はわかりません。しかし、試行錯誤の結果、私はその電話を避けました。

    CA証明書

    クライアント側のJavaアプリがSSL/TLS接続を開始するには、JDBCドライバーがCA証明書にアクセスできる必要があります。 DigitalOceanで使用されます。 Digital Ocean管理ページで、[CA証明書のダウンロード]をクリックします 小さなテキストファイルをダウンロードするためのリンク。そのファイルの名前はca-certificate.crtになります。 。

    そのファイルのテキストを文字列としてJDBCドライバーにフィードする必要があります。ファイルをテキスト文字列にロードするには、次の手順を実行します。

    // Get CA certificate used in TLS connections.
    Path path = Paths.get( "/Users/basilbourque/Downloads/ca-certificate.crt" );
    String cert = null;
    try
    {
        cert = Files.readString( path , StandardCharsets.UTF_8 );
        System.out.println( "cert = " + cert );
    }
    catch ( IOException ex )
    {
        throw new IllegalStateException( "Unable to load the TLS certificate needed to make database connections." );
    }
    Objects.requireNonNull( cert );
    if ( cert.isEmpty() ) {throw new IllegalStateException( "Failed to load TLS cert." ); }
    

    DataSource ::setSslCert 。私たちはではないことに注意してください <を呼び出すcode> setSslRootCert 。同じ名前の2つのメソッドを混同しないでください。

    dataSource.setSslCert( cert );
    

    接続のテスト

    最後に、構成済みの DataSourceを使用できます データベースに接続するオブジェクト。そのコードは次のようになります:

    // Test connection
    try (
            Connection conn = dataSource.getConnection() ;
            // …
    )
    {
        System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
        // …
    }
    catch ( SQLException e )
    {
        e.printStackTrace();
    }
    

    完全なサンプルコード

    これらすべてをまとめると、次のようなものが表示されます。

    // Get CA certificate used in TLS connections.
    Path path = Paths.get( "/Users/basilbourque/Downloads/ca-certificate.crt" );
    String cert = null;
    try
    {
        cert = Files.readString( path , StandardCharsets.UTF_8 );
        System.out.println( "cert = " + cert );
    }
    catch ( IOException ex )
    {
        throw new IllegalStateException( "Unable to load the TLS certificate needed to make database connections." );
    }
    Objects.requireNonNull( cert );
    if ( cert.isEmpty() ) {throw new IllegalStateException( "Failed to load TLS cert." ); }
    
    // PGSimpleDataSource configuration
    PGSimpleDataSource dataSource = new PGSimpleDataSource();
    
    String[] serverAddresses = { "your-server-address-goes-here" };
    dataSource.setServerNames( serverAddresses );
    int[] serverPortNumbers = { your-port-number-goes-here };
    dataSource.setPortNumbers( serverPortNumbers );
    dataSource.setSslCert( cert );
    dataSource.setDatabaseName( "defaultdb" );
    dataSource.setUser( "doadmin" );
    dataSource.setPassword( "your-password-goes-here" );
    
    // Test connection
    try (
    Connection conn = dataSource.getConnection() ;
    // …
    )
    {
    System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
    // …
    }
    catch ( SQLException e )
    {
    e.printStackTrace();
    }
    

    信頼できるソース

    DigitalOcean.comでPostgresインスタンスを作成すると、着信接続要求を制限する機能が提供されます。 DigitalOceanの用語で「信頼できるソース」であるPostgresサーバーが期待する単一のIPアドレスを指定できます。 Postgresサーバーに接続しようとするハッカーは、他のIPアドレスから発信されているため、無視されます。

    ヒント:このIPアドレス番号のデータ入力フィールド内をクリックすると、WebページがWebブラウザーで現在使用されているIPアドレスを自動的に検出して提供します。同じコンピュータからJavaコードを実行している場合は、単一の信頼できるソースと同じIP番号を使用してください。

    それ以外の場合は、JavaJDBCコードを実行しているコンピューターのIPアドレスを入力します。

    その他の問題

    CA証明書ファイルの管理に使用する適切なセキュリティプロトコルや、 DataSource を取得して接続情報を外部化するなど、詳細については説明していません。 JNDI からのオブジェクト ハードコーディング ではなくサーバー 。しかし、うまくいけば、上記の例があなたが始めるのに役立つでしょう。




    1. PHP pdo foreach

    2. 現在のすべてのデータベース名を検索するSQLServerクエリ

    3. mysqlにvarcharとして10進値を保存するのは良いですか?

    4. 以前にメッセージを送信したユーザーのリストを取得する必要があります(MySQL)