Использование внешнего хранилища доверия и хранилища ключей для postgres

#docker #ssl #keystore #postgresql-10 #truststore

#docker #ssl #хранилище ключей #postgresql-10 #хранилище доверия

Вопрос:

Я пытаюсь включить SSL для Postgres 10. Однако вместо указания файла ca я хотел бы использовать truststore.jks и keystore.p12, которые мне предоставлены. Postgres и наши службы обмена данными находятся каждый в своем собственном контейнере docker. Службы могут совместно использовать хранилище доверия и хранилище ключей, подключив их к общему тому и используя базовые команды Java при запуске:

 -Djavax.net.ssl.trustStore=${TRUSTSTORE_NAME}
  

Однако postgres работает по-другому (насколько мне известно). Он имеет следующие свойства в postgresql.conf:

 ssl = on
ssl_cert_file = '/server.crt'   
ssl_key_file = '/server.key'
ssl_ca_file = '/root.crt'
ssl_crl_file = '/ssl.crl'
  

Это сработает, если у меня будет доступ к этим сертификатам. Однако я не хочу указывать на конкретные сертификаты, потому что они уже будут в хранилище доверия, и я не буду знать их псевдоним — я хочу вместо этого сказать «используйте это хранилище доверия, которое я вам даю». Возможно ли это?

Ответ №1:

Хранилище ключей Java (*.jks) — это формат, специфичный для Java, и PostgreSQL написан не на Java, так что одно это дисквалифицирует вашу конфигурацию truststore keystore.

Что касается PKCS12 (расширение файла *.p12), то, хотя это стандарт, не зависящий от платформы, я когда-либо видел, чтобы он использовался в отношении PostgreSQL с различными клиентами (в первую очередь на основе JDBC) и никогда не предоставлял сертификаты серверу.

Принимая все это во внимание, OP, вам, к сожалению, придется извлекать сертификаты и использовать их напрямую.

Комментарии:

1. Не уверен, как поможет «извлечение сертификатов», поскольку вы не можете указать несколько клиентских сертификатов, которым следует доверять. Мне кажется, вы вынуждены сгенерировать центр сертификации (может быть самоподписанным), который затем вам нужно использовать для генерации сертификатов для клиентов, которые должны подключаться к серверу postgres. Затем используйте этот центр сертификации на сервере postgres.

2. @Martin Ни OP, ни я ничего не упоминали об использовании нескольких клиентских сертификатов. Я предполагаю, что keystore.p12 содержит сертификат сервера и ключ, в то время как truststore.jks содержит один или несколько центров сертификации, используемых для подписи одного или нескольких клиентских сертификатов. Это сертификаты (и ключ), которые OP необходимо извлечь. Если хранилище доверенных данных операционной системы на самом деле содержит конкретные сертификаты клиентов, то он действительно облажался, поскольку Postgres не позволяет указывать их — просто их CNS, которые будут использоваться совместно с CA (ами).

3. postgresql.org/docs/current/…

4. Спасибо за быстрое разъяснение!