sql >> Databáze >  >> RDS >> PostgreSQL

Nakonfigurujte „DataSource“ pro připojení ke spravovanému serveru Postgres na Digital Ocean se šifrováním SSL/TLS

Získání DataSource implementace

Obvykle váš ovladač JDBC poskytuje implementaci javax.sql.DataSource .

Další podrobnosti naleznete v části moje odpověď na podobnou otázku.

PGSimpleDataSource

Pokud používáte ovladač JDBC z jdbc.postgresql.org , můžete použít org.postgresql.ds.PGSimpleDataSource class jako váš DataSource implementace.

Vytvořte instanci objektu typu PGSimpleDataSource , pak zavolejte metody setter, abyste poskytli všechny informace potřebné pro připojení k vašemu databázovému serveru. Webová stránka na webu DigitalOcean uvádí všechny tyto informace pro vaši konkrétní instanci databáze.

V podstatě toto:

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

Množné názvy serverů a čísla portů

Bohužel singulární verze metod setServerName a setPortNumber jsou zastaralé. I když je to nepříjemné, pravděpodobně bychom měli používat množné číslo těchto metod (setServerNames &setPortNumbers ), že každý vezme pole. Naplníme dvojici jednoprvkových polí String[] a int[] , s adresou našeho serveru a číslem portu pomocí literálů pole:

  • { "adresa-vašeho-serveru jde-sem" }
  • { číslo vašeho-portu-jde-sem }
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" );

Šifrování SSL/TLS

Nakonec musíme přidat informace o šifrování SSL/TLS uvedené v otázce.

Ironicky, ne volání setSsl( true )

Mysleli byste si, že bychom nazvali setSsl metodu a předejte true . Ale ne. I když je to neintuitivní, nastavení na hodnotu true způsobí selhání vašich pokusů o připojení. nevím proč tomu tak je. Ale metodou pokus-omyl jsem se tomu hovoru vyhnul.

Certifikát CA

Aby vaše aplikace Java na straně klienta zahájila připojení SSL/TLS, musí mít ovladač JDBC přístup k certifikátu CA používá Digital Ocean. Na stránce správce Digital Ocean klikněte na Download CA certificate odkaz ke stažení malého textového souboru. Tento soubor se bude jmenovat ca-certificate.crt .

Potřebujeme vložit text tohoto souboru do našeho ovladače JDBC jako řetězec. Pro načtení souboru do textového řetězce proveďte následující.

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

Předejte tento text certifikátu CA svému ovladači JDBC pomocí volání DataSource::setSslCert . Všimněte si, že nejsme volání setSslRootCert . Nezaměňujte dvě podobně pojmenované metody.

dataSource.setSslCert( cert );

Testování připojení

Nakonec můžeme použít nakonfigurovaný DataSource objekt pro připojení k databázi. Tento kód bude vypadat takto:

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

Úplný příklad kódu

Když to všechno dáte dohromady, uvidíte něco takového.

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

Důvěryhodný zdroj

Při vytváření instance Postgres na DigitalOcean.com vám bude nabídnuta možnost omezit příchozí požadavky na připojení. Můžete zadat jednu IP adresu, kterou očekává server Postgres, „důvěryhodný zdroj“ v žargonu Digital Ocean. Všichni hackeři, kteří se pokusí připojit k vašemu serveru Postgres, budou ignorováni, protože pocházejí z jiných IP adres.

Tip:Klikněte do pole pro zadávání dat pro toto číslo IP adresy, aby webová stránka automaticky detekovala a nabídla IP adresu, kterou aktuálně používá váš webový prohlížeč. Pokud spouštíte kód Java ze stejného počítače, použijte stejné číslo IP jako svůj jediný důvěryhodný zdroj.

V opačném případě zadejte IP adresu počítače, na kterém je spuštěn váš kód Java JDBC.

Další problémy

Nezabýval jsem se podrobnostmi, jako jsou správné bezpečnostní protokoly pro správu souboru certifikátu CA nebo jako externalizace informací o připojení získáním DataSource objekt z JNDI server spíše než pevné kódování . Ale doufejme, že výše uvedené příklady vám pomohou začít.




  1. Převeďte bajtové pole Java na bajtové pole Pythonu

  2. Počínaje verzováním schémat mysql bez přetěžování. Dobrá řešení?

  3. Objednejte dotaz Oracle podle SUM bez výběru SUM

  4. Aktualizace z MYSQL na MYSQLI