Використання psql для підключення до PostgreSQL в режимі SSL


77

Я намагаюся налаштувати SSL-сертифікат для сервера PostgreSQL. Я створив файл сертифіката (server.crt) та ключ (server.key) у каталозі даних та оновив параметр SSL до "on", щоб увімкнути безпечне з'єднання.

Я просто хочу, щоб лише сервер пройшов аутентифікацію за допомогою сертифікатів сервера на стороні клієнта і не вимагав автентичності клієнта на стороні сервера. Я використовую psql як клієнт для підключення та виконання команд.

Я використовую PostgreSQL 8.4 та Linux. Я спробував за допомогою наведеної нижче команди підключитися до сервера з увімкненим SSL

       psql "postgresql://localhost:2345/postgres?sslmode=require"

але я отримую

       psql: invalid connection option "postgresql://localhost:2345/postgres?sslmode"

Що я тут роблю не так? Чи правильно я намагаюся підключитися до сервера із увімкненим режимом SSL? Чи добре аутентифікувати лише сервер, а не клієнта?


Призначений порт 2345 замість типового 5432?
Ервін Брандштеттер,

Так. Це налаштований порт.
Lolly

2
Якщо ви хочете, щоб з’єднання було захищеним від атак MITM, використовуйте sslmode=verify-full, а не просто require.
Бруно

Відповіді:


111

psql нижче 9.2 не приймає цей URL-подібний синтаксис варіантів.

Використання SSL може бути обумовлене sslmode=valueопцією в командному рядку або змінною середовища PGSSLMODE , але за замовчуванням preferSSL-з'єднання спробують спочатку автоматично, не вказуючи нічого.

Приклад із рядком conninfo ( оновлено для psql 8.4 )

psql "sslmode=require host=localhost dbname=test"

Прочитайте сторінку керівництва, щоб дізнатись більше.


Я отримав цей синтаксис рядка підключення за цим посиланням. postgresql.org/docs/9.2/static/app-psql.html
Лоллі

2
Я теж спробував із вашим варіантом, psql -h localhost -p 2345 -U thirunas -d postgres "sslmode=require" -f test_schema.ddl але там написано sql: warning: extra command-line argument "sslmode=require" ignored
Lolly

@annonymous ви говорите, що отримали синтаксис документації 9.2, але ви також говорите, що використовуєте версію 8.4. Те, що ви використовуєте, не зазначено у документі 8.4. Спробуйте також поставити "sslmode = require" як перший аргумент.
Бруно

1
@Bruno: Я зрозумів помилку. Щойно помітив різницю у версіях в документації. Але, маючи це також у першому аргументі, я отримую те саме попередження. psql -h localhost "sslmode=require" -p 2345 -U thirunas -d postgres -f test_schema.ddl. Попередженняpsql: warning: extra command-line argument "sslmode=require" ignored
Лоллі

4
@Wave та інші, хто стикається з цим, рядок conninfo використовується замість імені бази даних (-d). Ви можете вказати ім'я бази даних після параметра -d або як перший аргумент, що не є опцією, у командному рядку. Тож -d postgres "sslmode = require" має бути або psql [options] -d "dbname = postgres sslmode = require" [інші варіанти], або psql [options] "dbname = postgres sslmode = require". Ви можете перемістити багато інших параметрів у рядок conninfo.
jla

26
psql --set=sslmode=require -h localhost -p 2345 -U thirunas \
-d postgres -f test_schema.ddl

Ще один приклад безпечного підключення до керованої бази даних Postgres Azure:

psql --file=product_data.sql --host=hostname.postgres.database.azure.com --port=5432 \
--username=postgres@postgres-esprit --dbname=product_data \
--set=sslmode=verify-full --set=sslrootcert=/opt/ssl/BaltimoreCyberTrustRoot.crt.pem

3
Це неправильно. --set=sslmode=requireвизначає змінну psql, яка взагалі не бере участь у процесі автентифікації. Це нічого не робить, щоб примусити SSL.
Даніель Верите

6

Знайдено наступні опції, корисні для надання всіх файлів для самостійно підписаного екземпляра postgres

psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} dbname={db}"

3

На psql-клієнті v12 я не зміг знайти опцію в psql-клієнті для активації sslmode=verify-full.

У підсумку я використав змінні середовища:

PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db

1
для автентифікації TLS вам також знадобляться: PGSSLCERTі PGSSLKEYта скиньте-W
Paweł Prażak

2

psql "sslmode=require host=localhost port=2345 dbname=postgres" --username=some_user

Згідно з документацією postgres psql , у рядку conninfo повинні знаходитись лише параметри підключення (ось чому в нашому прикладі --username не знаходиться всередині цього рядка)


Я думав, що це теж спочатку, але після перечитання розділу Підключення до бази даних, я беру альтернативний спосіб вказати параметри підключення в рядку conninfo, який використовується замість імені бази даних. Цей механізм дає вам дуже широкий контроль над з'єднанням. як значення, ви можете записувати будь-які аргументи в conninfoрядок. Але я також думаю, що документи також можна зробити тут більш чіткими.
Остін А,


1

Ну, хмара надає всю інформацію за допомогою наступної команди в CLI, якщо підключення потрібно в режимі SSL:

psql "sslmode=verify-ca sslrootcert=server-ca.pem sslcert=client-cert.pem sslkey=client-key.pem hostaddr=your_host port=5432 user=your_user dbname=your_db" 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.