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.