Beziehen einer DataSource
Umsetzung
Normalerweise Ihr JDBC-Treiber
bietet eine Implementierung von javax.sql.DataSource
.
Weitere Einzelheiten finden Sie unter meine Antwort auf eine ähnliche Frage.
PGSimpleDataSource
Bei Verwendung des JDBC-Treibers von jdbc.postgresql.org
, können Sie org.postgresql.ds.PGSimpleDataSource
Klasse als Ihre DataSource
Umsetzung.
Instanziieren Sie ein Objekt vom Typ PGSimpleDataSource
, und rufen Sie dann Setter-Methoden auf, um alle Informationen bereitzustellen, die für die Verbindung mit Ihrem Datenbankserver erforderlich sind. Die Webseite auf der DigitalOcean-Site listet all diese Informationen für Ihre spezielle Datenbankinstanz auf.
Im Grunde dies:
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" );
Mehrere Servernamen und Portnummern
Leider ist die Singularversion der Methoden setServerName
und setPortNumber
sind veraltet. Obwohl es ärgerlich ist, sollten wir wahrscheinlich die Pluralversion dieser Methoden verwenden (setServerNames
&setPortNumbers
), die jeweils ein Array annehmen. Wir füllen ein Paar von Einzelelement-Arrays, String[]
und int[]
, mit der Adresse unseres Servers und Portnummer
Verwenden von Array-Literalen:
- { "Ihre-Server-Adresse-geht-hier" }
- { Ihre-Port-Nummer-geht-hier }
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-Verschlüsselung
Zuletzt müssen wir Informationen für die in der Frage angesprochene SSL/TLS-Verschlüsselung hinzufügen.
Ironischerweise nicht rufen Sie setSsl( true )
auf
Man könnte meinen, wir würden setSsl
-Methode und übergeben Sie true
. Aber nein. Es ist zwar kontraintuitiv, aber wenn Sie dies auf „true“ setzen, schlagen Ihre Verbindungsversuche fehl. Ich weiß nicht, warum das so ist. Aber Trial-and-Error führte dazu, dass ich diesen Anruf vermied.
CA-Zertifikat
Damit Ihre clientseitige Java-App die SSL/TLS-Verbindung initiieren kann, muss der JDBC-Treiber Zugriff auf das CA-Zertifikat haben von Digital Ocean verwendet. Klicken Sie auf Ihrer Digital Ocean-Admin-Seite auf Download CA certificate
Link zum Herunterladen einer kleinen Textdatei. Diese Datei heißt ca-certificate.crt
.
Wir müssen den Text dieser Datei als Zeichenfolge an unseren JDBC-Treiber übergeben. Gehen Sie wie folgt vor, um die Datei in eine Textzeichenfolge zu laden.
// 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." ); }
Übergeben Sie diesen CA-Zertifikatstext an Ihren JDBC-Treiber mit einem Aufruf von DataSource::setSslCert
. Beachten Sie, dass wir nicht sind Aufruf von setSslRootCert
. Verwechseln Sie die beiden gleichnamigen Methoden nicht.
dataSource.setSslCert( cert );
Verbindung testen
Schließlich können wir die konfigurierte DataSource
verwenden Objekt, um eine Verbindung zur Datenbank herzustellen. Dieser Code sieht folgendermaßen aus:
// Test connection
try (
Connection conn = dataSource.getConnection() ;
// …
)
{
System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
// …
}
catch ( SQLException e )
{
e.printStackTrace();
}
Vollständiger Beispielcode
Wenn man das alles zusammenfasst, sieht man so etwas.
// 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();
}
Vertrauenswürdige Quelle
Beim Erstellen Ihrer Postgres-Instanz auf DigitalOcean.com wird Ihnen die Möglichkeit angeboten, eingehende Verbindungsanforderungen einzuschränken. Sie können eine einzelne IP-Adresse angeben, die vom Postgres-Server erwartet wird, einer „vertrauenswürdigen Quelle“ im Jargon von Digital Ocean. Alle Hacker, die versuchen, sich mit Ihrem Postgres-Server zu verbinden, werden ignoriert, da sie von anderen IP-Adressen stammen.
Tipp:Klicken Sie in das Eingabefeld für diese IP-Adressnummer, damit die Webseite automatisch die aktuell von Ihrem Webbrowser verwendete IP-Adresse erkennt und anbietet. Wenn Sie Ihren Java-Code auf demselben Computer ausführen, verwenden Sie dieselbe IP-Nummer als einzige vertrauenswürdige Quelle.
Geben Sie andernfalls die IP-Adresse des Computers ein, auf dem Ihr Java-JDBC-Code ausgeführt wird.
Andere Probleme
Ich habe mich nicht mit Ausarbeitungen befasst, wie z. B. geeigneten Sicherheitsprotokollen zum Verwalten Ihrer CA-Zertifikatsdatei oder wie das Externalisieren Ihrer Verbindungsinformationen durch Abrufen einer DataSource
Objekt aus einem JNDI
Server statt hard-coding
. Aber hoffentlich helfen Ihnen die obigen Beispiele beim Einstieg.