PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Конфигурирайте „Източник на данни“, за да се свържете с управляван Postgres сървър на Digital Ocean с SSL/TLS криптиране

Получаване на DataSource изпълнение

Обикновено вашият JDBC драйвер предоставя имплементация на javax.sql.DataSource .

За повече подробности вижте моя отговор на подобен въпрос.

PGSimpleDataSource

Ако използвате JDBC драйвера от jdbc.postgresql.org , можете да използвате org.postgresql.ds.PGSimpleDataSource клас като ваш DataSource изпълнение.

Създайте екземпляр на обект от тип PGSimpleDataSource , след това извикайте методи за настройка, за да предоставите цялата информация, необходима за свързване към вашия сървър на база данни. Уеб страницата на сайта на DigitalOcean изброява всички тези части от информацията за вашето конкретно копие на базата данни.

По принцип това:

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

Множествени имена на сървъри и номера на портове

За съжаление, единствената версия на методите setServerName и setPortNumber са отхвърлени. Въпреки че е досадно, вероятно трябва да използваме множественото число на тези методи (setServerNames &setPortNumbers ), всеки от които приема масив. Ние попълваме двойка едноелементни масиви, String[] и int[] , с адреса на нашия сървър и номер на порт с помощта на масивни литерали:

  • { "адресът-на-сървъра-отива-тук" }
  • { номерът-на-порта ви отива тук }
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 криптиране

Накрая трябва да добавим информация за SSL/TLS криптирането, разгледано във въпроса.

По ирония на съдбата, не извикване на setSsl( true )

Бихте си помислили, че ще наречем setSsl метод и предаване на true . Но не. Въпреки че не е интуитивно, настройката на това на true ще доведе до неуспешни опити за свързване. Не знам защо е така. Но методът проба-грешка ме накара да избегна това обаждане.

CA сертификат

За да може вашето Java приложение от страна на клиента да инициира SSL/TLS връзка, JDBC драйверът трябва да има достъп до CA сертификата използван от Digital Ocean. На вашата страница за администриране на Digital Ocean щракнете върху Download CA certificate връзка за изтегляне на малък текстов файл. Този файл ще бъде наречен ca-certificate.crt .

Трябва да подадем текста на този файл към нашия JDBC драйвер като низ. Направете следното, за да заредите файла в текстов низ.

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

Предайте този текст на CA сертификат на вашия JDBC драйвер с извикване на DataSource::setSslCert . Имайте предвид, че ние не извикване на setSslRootCert . Не смесвайте двата метода с подобни имена.

dataSource.setSslCert( cert );

Тестване на връзката

И накрая, можем да използваме конфигурирания DataSource обект за осъществяване на връзка с базата данни. Този код ще изглежда така:

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

Пълен примерен код

Събирайки всичко това заедно, вижте нещо подобно.

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

Доверен източник

Когато създавате своя екземпляр на Postgres на DigitalOcean.com, ще ви бъде предложена възможността да ограничите входящите заявки за връзка. Можете да посочите единичен IP адрес, който да се очаква от сървъра на Postgres, „доверен източник“ на езика на Digital Ocean. Всички хакери, които се опитват да се свържат с вашия Postgres сървър, ще бъдат игнорирани, тъй като идват от други IP адреси.

Съвет:Щракнете в полето за въвеждане на данни за този номер на IP адрес, за да може уеб страницата автоматично да открие и предложи IP адреса, използван в момента от вашия уеб браузър. Ако изпълнявате своя Java код от същия компютър, използвайте същия IP номер като единствен доверен източник.

В противен случай въведете IP адреса на компютъра, на който работи вашият Java JDBC код.

Други проблеми

Не съм се занимавал с уточнения, като например подходящи протоколи за сигурност, които да използвате за управление на вашия файл със сертификат на CA, или като екстернализиране на информацията за вашата връзка чрез получаване на DataSource обект от JNDI сървър, а не твърдо кодиране . Но се надяваме, че примерите по-горе ще ви помогнат да започнете.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да форматирате числата като валута в PostgreSQL

  2. PostgreSQL връща точна или най-близка дата до заявената дата

  3. Не можете да вмъкнете нов ред в таблицата на базата данни на postgres?

  4. Как правите ГИС заявки на Heroku, използвайки споделената база данни?

  5. Как да изхвърлите структурата на базата данни на PostgreSQL (всеки обект в отделен файл)