#Симптом и границы применимости
Приложение не подключается к PostgreSQL с TLS: встречаются ошибки сертификата, неверного имени сервера, отсутствия ssl=on или неподходящего правила hostssl. Безопасное исправление сохраняет шифрование и проверку подлинности, а не выключает их.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет доверенного центраКлиент не может проверить цепочку сертификата сервера. | certificate verify failed | Настроить правильный корневой сертификат |
| Не совпадает имя сервераПодключение идёт по IP, но сертификат выдан на доменное имя. | hostname mismatch при verify-full | Использовать DNS-имя из сертификата |
| Сервер не предлагает SSLssl выключен либо сертификат не загружен. | server does not support SSL | Проверить настройки сервера и журнал |
#Пошаговая диагностика и безопасное исправление
- 1. Сохраните ошибку клиента целикомНайдите точное сообщение sslrootcert, certificate verify failed, hostname mismatch или no pg_hba.conf entry for host ... SSL on/off. Не объединяйте эти случаи в универсальную «ошибку пароля».
- 2. Проверьте параметры подключения приложенияНайдите host, port, dbname, sslmode и путь к корневому сертификату в конфигурации приложения. Не отправляйте в переписку пароль или клиентский ключ; убедитесь, что приложение использует ожидаемый адрес, а не подменённый IP.
- 3. Проверьте соединение по имени и с проверкой узлаИз терминала клиентского сервера используйте psql с verify-full и путём к доверенному корню. В примере db.example.test — условное имя, замените на домен, указанный в сертификате.Linux · Терминал (Bash)КомандаТерминал клиента с psql; пароль вводится интерактивно. Не заменяйте verify-full на disable.
psql "host=db.example.test port=5432 dbname=appdb user=app_user sslmode=verify-full sslrootcert=/secure/ca.crt" -c "SELECT 1;"
- 4. Проверьте фактическое шифрованиеПосле успешного соединения в psql выполните запрос к pg_stat_ssl для собственного backend. Поле ssl должно быть true, а version — TLS; это не проверяет цепочку сертификата само по себе.
- psql, чтение факта TLS для текущей сессииSQLКомандаpsql, чтение факта TLS для текущей сессии.
SELECT ssl, version, cipher FROM pg_stat_ssl WHERE pid=pg_backend_pid();
- 5. Сверьте настройки TLS сервераАдминистратор PostgreSQL проверяет SHOW ssl, расположение cert/key, журнал загрузки сертификата и соответствие ключа. Сервер обычно требует надлежащие права на приватный ключ; не делайте его общедоступным.SQLКомандаpsql; чтение параметров сервера, файловые пути могут быть относительными к data directory.
SHOW ssl;SHOW ssl_cert_file;SHOW ssl_key_file;
- 6. Сопоставьте pg_hba.conf с типом соединенияЕсли применяется hostssl, проверьте, что строка подходит адресу и роли приложения; порядок правил важен. Исправление на тестовой машине должно сохранять проверку пароля и ограничивать источник.
- 7. Обновите сертификат или доверие по документированному процессуИспользуйте действующий сертификат с нужным DNS-именем и цепочкой доверия. Удаление проверки hostname, подмена корневого сертификата случайным файлом или sslmode=disable маскируют ошибку и снижают безопасность.
- 8. Проверьте приложение после согласованного измененияПроверьте несколько новых подключений через пул и убедитесь, что TLS остаётся включённым и приложение выполняет тестовый SELECT. После перевыпуска сертификата наблюдайте за ошибками в журнале сервера и клиента.
#Как проверить, что проблема устранена
psql через verify-full успешно подключается по имени из сертификата, pg_stat_ssl показывает ssl=true, а приложение выполняет запросы без отказов проверки.
#Если исправление не помогло
Если не помогло, проверьте различия DNS между контейнером приложения и сервером, срок действия сертификата, сертификаты промежуточных центров и clientcert в pg_hba.conf.