PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Konfigurasikan `DataSource` untuk terhubung ke server Postgres terkelola di Digital Ocean dengan enkripsi SSL/TLS

Mendapatkan DataSource implementasi

Biasanya driver JDBC Anda menyediakan implementasi javax.sql.DataSource .

Untuk detail selengkapnya, lihat Jawaban saya untuk Pertanyaan serupa.

PGSimpleDataSource

Jika menggunakan driver JDBC dari jdbc.postgresql.org , Anda dapat menggunakan org.postgresql.ds.PGSimpleDataSource kelas sebagai DataSource . Anda implementasi.

Buat instance objek bertipe PGSimpleDataSource , lalu panggil metode penyetel untuk menyediakan semua info yang diperlukan untuk terhubung ke server database Anda. Halaman web di situs DigitalOcean mencantumkan semua informasi ini untuk instance database khusus Anda.

Pada dasarnya ini:

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" );

Nama server jamak dan nomor port

Sayangnya, versi tunggal dari metode setServerName dan setPortNumber tidak digunakan lagi. Meskipun menjengkelkan, kita mungkin harus menggunakan versi jamak dari metode tersebut (setServerNames &setPortNumbers ) yang masing-masing mengambil array. Kami mengisi sepasang array elemen tunggal, String[] dan int[] , dengan alamat server kami dan nomor port menggunakan literal array:

  • { "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" );

Enkripsi SSL/TLS

Terakhir kita perlu menambahkan info untuk enkripsi SSL/TLS yang dibahas dalam Pertanyaan.

Ironisnya, jangan jangan panggil setSsl( true )

Anda akan mengira kami akan memanggil setSsl metode dan berikan true . Tapi tidak. Meskipun kontra-intuitif, menyetelnya ke true akan menyebabkan upaya koneksi Anda gagal. Saya tidak tahu mengapa demikian. Tapi coba-coba membuat saya menghindari panggilan itu.

Sertifikat CA

Agar aplikasi Java sisi klien Anda memulai koneksi SSL/TLS, driver JDBC harus memiliki akses ke sertifikat CA digunakan oleh Digital Ocean. Di halaman admin Digital Ocean Anda, klik Download CA certificate tautan untuk mengunduh file teks kecil. File itu akan diberi nama ca-certificate.crt .

Kita perlu memasukkan teks file itu ke driver JDBC kita sebagai string. Lakukan hal berikut untuk memuat file ke dalam string teks.

// 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." ); }

Teruskan teks sertifikat CA tersebut ke driver JDBC Anda dengan panggilan ke DataSource::setSslCert . Perhatikan bahwa kami bukan memanggil setSslRootCert . Jangan mencampuradukkan dua metode dengan nama yang mirip.

dataSource.setSslCert( cert );

Menguji koneksi

Terakhir, kita dapat menggunakan DataSource yang dikonfigurasi objek untuk membuat koneksi ke database. Kode itu akan terlihat seperti ini:

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

Kode contoh lengkap

Menyatukan semua itu, lihat sesuatu seperti ini.

// 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();
}

Sumber tepercaya

Saat membuat instans Postgres Anda di DigitalOcean.com, Anda akan ditawari kemampuan untuk membatasi permintaan koneksi yang masuk. Anda dapat menentukan satu alamat IP yang diharapkan oleh server Postgres, "sumber tepercaya" dalam istilah Digital Ocean. Setiap peretas yang mencoba menyambung ke server Postgres Anda akan diabaikan karena berasal dari alamat IP lain.

Tip:Klik di dalam bidang entri data untuk nomor alamat IP ini agar halaman web secara otomatis mendeteksi dan menawarkan alamat IP yang sedang digunakan oleh browser web Anda. Jika Anda menjalankan kode Java dari komputer yang sama, gunakan nomor IP yang sama sebagai satu-satunya sumber tepercaya Anda.

Jika tidak, ketik alamat IP komputer yang menjalankan kode Java JDBC Anda.

Masalah lainnya

Saya belum membahas elaborasi, seperti protokol keamanan yang tepat untuk digunakan untuk mengelola file sertifikat CA Anda, atau seperti mengeksternalkan info koneksi Anda dengan mendapatkan DataSource objek dari JNDI server daripada hard-coding . Tapi semoga contoh di atas membantu Anda memulai.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PG::Error:ERROR:urutan byte tidak valid untuk encoding UTF8:0xfc

  2. Indeks Postgresql pada ekspresi xpath tidak memberikan kecepatan

  3. pg_ctl Tips dan Trik

  4. Postgresql:Bagaimana cara menghindari tanda kutip tunggal di pemicu Database?

  5. Cara Membuat Array di PostgreSQL