Использование psql для подключения к PostgreSQL в режиме SSL

Я пытаюсь настроить 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? Можно ли аутентифицировать только сервер, а не клиента?


person Lolly    schedule 24.12.2012    source источник
comment
Порт 2345 вместо дефолтного 5432 предназначен?   -  person Erwin Brandstetter    schedule 24.12.2012
comment
да. Это настроенный порт.   -  person Lolly    schedule 24.12.2012
comment
Если вы хотите, чтобы соединение было защищено от атак MITM, используйте sslmode=verify-full, а не только require.   -  person Bruno    schedule 24.12.2012


Ответы (8)


psql ниже 9.2 не принимает этот URL-подобный синтаксис для параметров.

Использование SSL может управляться параметром sslmode=value в командной строке или Переменная среды PGSSLMODE, но по умолчанию prefer, SSL-соединения будут проверяться сначала автоматически без указания каких-либо данных.

Пример со строкой conninfo (обновлено для psql 8.4)

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

Прочтите страницу руководства, чтобы узнать о дополнительных возможностях.

person Daniel Vérité    schedule 24.12.2012
comment
Я получил этот синтаксис строки подключения по этой ссылке. postgresql.org/docs/9.2/static/app-psql.html < / а> - person Lolly; 24.12.2012
comment
Я тоже пробовал использовать ваш вариант psql -h localhost -p 2345 -U thirunas -d postgres "sslmode=require" -f test_schema.ddl, но там написано sql: warning: extra command-line argument "sslmode=require" ignored - person Lolly; 24.12.2012
comment
@annonymous, вы говорите, что у вас есть синтаксис документации 9.2, но вы также говорите, что используете версию 8.4. То, что вы используете, не упоминается в документе 8.4. Попробуйте также указать sslmode = require в качестве первого аргумента. - person Bruno; 24.12.2012
comment
@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 - person Lolly; 24.12.2012
comment
@annonymous: ответ обновлен, чтобы использовать только строку conninfo с синтаксисом, принятым psql 8.4 - person Daniel Vérité; 24.12.2012
comment
Я не знал, что psql теперь поддерживает URL-адреса в стиле JDBC. Потрясающие. - person Craig Ringer; 25.12.2012
comment
Я получаю psql: FATAL: connection requires a valid client certificate. Я знаю, где находятся мои сертификаты, но как указать это местоположение для psql? - person Jorn; 30.01.2015
comment
@Jorn: см. Переменные среды PGSSLCERT и PGSSLKEY - person Daniel Vérité; 30.01.2015
comment
@Wave и другие, которые сталкиваются с этим, строка conninfo используется вместо имени базы данных (-d). Вы можете указать имя базы данных после параметра -d или в качестве первого аргумента, не являющегося параметром, в командной строке. Итак, -d postgres sslmode = require должно быть либо psql [options] -d dbname = postgres sslmode = require [other options], либо psql [options] dbname = postgres sslmode = require. Вы можете переместить многие другие параметры в строку conninfo. - person jla; 14.03.2015

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
person Andrii Batiuk    schedule 13.05.2016
comment
Это неверно. --set=sslmode=require определяет переменную psql, которая вообще не участвует в процессе аутентификации. Он ничего не делает для принудительного использования SSL. - person Daniel Vérité; 02.06.2020
comment
Я могу подтвердить, что это не работает, как указал @ DanielVérité. Тестирование с сервером postgres с ненадежным сертификатом и использованием --set=sslmode=verify-full не вызовет жалоб. - person LEDfan; 24.03.2021

Обнаружены следующие параметры, полезные для предоставления всех файлов для самоподписанного экземпляра postgres

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

В клиенте psql v12 я не смог найти в клиенте psql возможность активировать sslmode=verify-full.

В итоге я использовал переменные среды:

PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db
person FredG    schedule 08.07.2020
comment
для аутентификации TLS вам также понадобятся: PGSSLCERT и PGSSLKEY и удалите -W - person Paweł Prażak; 09.12.2020

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

Согласно документации postgres psql, должны идти только параметры подключения в строке conninfo (поэтому в нашем примере --username не находится внутри этой строки)

person Komu    schedule 10.03.2016
comment
Сначала я тоже так подумал, но после перечитывания раздела «Подключение к базе данных» беру . Альтернативный способ указать параметры подключения - это строка conninfo, которая используется вместо имени базы данных. Этот механизм дает вам очень широкий контроль над соединением. означает, что вы можете вставлять любые аргументы в строку conninfo. Но я также думаю, что здесь документы можно было бы сделать более понятными. - person Austin A; 27.06.2018

psql -h <host> -p <port> -U <user> -d <db>

и обновите /var/lib/pgsql/10/data/pg_hba.conf, чтобы изменить метод аутентификации на cert. Перейдите по следующей ссылке для получения дополнительной информации:

https://www.postgresql.org/docs/9.1/auth-pg-hba-conf.html

person WesternGun    schedule 06.02.2019

Что ж, вы предоставляете всю информацию в облаке с помощью следующей команды в 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" 
person Sabuhi Shukurov    schedule 03.01.2020
comment
Это рекомендуемый метод Google Cloud, и я могу подтвердить, что он работает. Источник: cloud.google.com/sql/docs/ postgres / connect-admin-ip # connect-ssl. - person Elouan Keryell-Even; 10.06.2021
comment
да, работает, на тот момент у гугла этой рекомендации не было, у меня украли: D просто шучу)) - person Sabuhi Shukurov; 10.06.2021
comment
Вы настоящий MVP, Google, пожалуйста, дайте куки этому человеку! ❤ - person Elouan Keryell-Even; 11.06.2021

Другой шаблон, который работал с v8, это

psql -h имя_хоста -p порт -U имя_пользователя dbname = db sslmode = require

person Vijay Hebbar    schedule 16.06.2021