PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Konfigurieren Sie eine „Datenquelle“, um eine Verbindung zu einem verwalteten Postgres-Server auf Digital Ocean mit SSL/TLS-Verschlüsselung herzustellen

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.