SSL на PostgreSQL

Вопрос или проблема

Я пытаюсь настроить свой сервер PostgreSQL для использования SSL-соединений. Я правильно настроил файлы postgresql.conf и pg_hba.conf. Я создал ключ и самоподписанный сертификат (server.crt и server.key) в каталоге данных postgres и скопировал server.crt в root.crt.

Я также создал сертификат и ключ на другом хосте, используя root.crt с сервера для подписи клиентского сертификата. Когда я использую openssl для тестирования сертификата, все в порядке. Однако, когда я пытаюсь подключиться к серверу PostgreSQL, это завершается неудачей:

psql -h <HOSTNAME> -U <USER> -d <DB>
psql: SSL error: certificate verify failed

Альтернативный вариант:

openssl s_client -connect <HOSTNAME>:5432 -state -msg -showcerts -debug
CONNECTED(00000003)
SSL_connect:before/connect initialization
write to 080ACFE0 [080AD570] (145 bytes => 145 (0x91))
0000 - 80 8f 01 03 01 00 66 00-00 00 20 00 00 39 00 00   ......f... ..9..
...
0080 - 04 fd be bd 49 e7 1d 99-f5 bb 7e 24 2e fe 34 e8   ....I.....~$..4.
0090 - d7                                                .
>>> SSL 2.0 [length 008f], CLIENT-HELLO
    01 03 01 00 66 00 00 00 20 00 00 39 00 00 38 00
    ...
    be bd 49 e7 1d 99 f5 bb 7e 24 2e fe 34 e8 d7
SSL_connect:SSLv2/v3 write client hello A
read from 080ACFE0 [080B2AD0] (7 bytes => 0 (0x0))
18357:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:226:

Наконец, если я настраиваю openssl для работы на стороне сервера и подключаюсь с клиентского хоста, это работает без проблем:

openssl s_client -connect <HOSTNAME>:4433 -state -msg -showcerts -debug

Есть идеи, почему PostgreSQL не принимает мои сертификаты? Для моей текущей конфигурации сервер работает на FreeBSD 4.7 с PostgreSQL 8.1, а клиент на CentOS 4 с PostgreSQL 9.0. Не уверен, влияет ли это на ситуацию…

PostgreSQL не начинает SSL-обмен, пока вы не отправите пакет, приказывающий ему это сделать. s_client ожидает, что он выполнит SSL до получения этого пакета. Смотрите http://www.postgresql.org/docs/9.0/static/protocol-flow.html#AEN84524 для документации о том, как работает SSL в PostgreSQL.

Проверьте, что ваш корневой сертификат находится в правильном месте на клиенте и что он доступен для чтения для PostgreSQL. Возможно, стоит запустить strace, чтобы убедиться, что он действительно читается. Это, безусловно, самая распространенная причина, по которой все не работает.

И, как уже отмечалось ранее, вам следует перейти с 8.1 как можно скорее, так как поддержка уже завершена. Но это не должно оказать серьезного влияния на ситуацию.

Удаление моего старого ~/.postgresql решило проблему для меня. Попробуйте strace psql, чтобы проверить вызовы open.

Это должно сработать:

echo "" | openssl s_client -starttls postgres -connect EXAMPLE.COM:5432 -showcerts

Ответ или решение

Настройка SSL для PostgreSQL может быть сложной задачей, особенно учитывая версию, которую вы используете (PostgreSQL 8.1 — устаревшая версия). Ниже приведены шаги, которые могут помочь в решении проблемы с подключением SSL.

  1. Проверка конфигурации PostgreSQL: Убедитесь, что у вас правильно настроены файлы postgresql.conf и pg_hba.conf. В файле postgresql.conf вам нужно установить следующие параметры для активации SSL:

    ssl = on
    ssl_cert_file = 'server.crt'
    ssl_key_file = 'server.key'

    В файле pg_hba.conf убедитесь, что вы разрешаете подключения с использованием SSL, например:

    hostssl all all 0.0.0.0/0 cert
  2. Проверка сертификатов: Убедитесь, что корневой сертификат (root.crt) доступен на клиенте и его можно прочитать пользователю, под которым работает PostgreSQL. Этот сертификат должен содержать корневой сертификат, который подписал ваш клиентский сертификат. Проверьте, правильно ли настроены разрешения на файлы сертификатов:

    chmod 600 server.key
    chmod 644 server.crt
  3. Обновление/Удаление каталога конфигурации: Как вы заметили, удаление каталога ~/.postgresql может решить проблему. Попробуйте удалить или переименовать этот каталог на клиенте, так как старые настройки или сертификаты могут вызывать конфликты.

  4. Проверка с помощью OpenSSL: Для тестирования SSL-соединения вы можете использовать команду OpenSSL. Убедитесь, что вы используете правильный синтаксис для подключения к PostgreSQL:

    echo "" | openssl s_client -starttls postgres -connect <HOSTNAME>:5432 -showcerts

    Это должно инициировать соединение с PostgreSQL и показать сертификаты, если все настроено правильно.

  5. Спецификации версий: Учтите, что PostgreSQL 8.1 не поддерживается, и использование этой версии может быть связано с уязвимостями и отсутствующими функциями, включая поддержку современных методов шифрования. Рекомендуется обновить до более новой версии PostgreSQL, чтобы обеспечить безопасность и совместимость.

  6. Отладка с помощью strace: Для более детальной отладки выполняйте strace над командой psql, чтобы увидеть, какие файлы открываются и какие ошибки возникают. Например:

    strace -e trace=open psql -h <HOSTNAME> -U <USER> -d <DB>

Следуя этим шагам, вы сможете устранить проблемы с подключением по SSL к вашему серверу PostgreSQL. Убедитесь, что на сервере и клиенте используются взаимосвязанные сертификаты и что все настройки выполнены корректно.

Оцените материал
Добавить комментарий

Капча загружается...