データソース
の取得 実装
通常、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
からのオブジェクト ハードコーディング
ではなくサーバー 。しかし、うまくいけば、上記の例があなたが始めるのに役立つでしょう。