предоставление сертификатов для подключения tomcat jndi к postgresql - PullRequest
1 голос
/ 21 октября 2019

Я хочу подключиться к серверу postgresql из сервлета в tomcat, используя jndi.

Я добавил сертификат сервера в хранилище доверенных сертификатов, используя keytool -keystore /usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts -alias postgresql -import -file ~/postgres.infra-kk.der, где файл der - это сертификат сервера, преобразованный в der,Домашний каталог пользователя tomcat - / var / lib / tomcat9. /var/lib/tomcat9/.postgresql содержит следующие файлы:

  • postgresql.crt сертификат клиента в формате pem
  • postgresql.pk8 личный ключ клиента в pk8 с зашифрованным ключомformat
  • postgresql.key закрытый ключ клиента в формате pem

(это символические ссылки на реальные файлы). Я могу без проблем соединить базу данных с psql.

Однако в Tomcat я получаю следующее исключение:

org.postgresql.util.PSQLException: FATAL: connection requires a valid client certificate

Я прочитал Предоставление сертификатов Tomcat для Postgres Connection , https://jdbc.postgresql.org/documentation/head/ssl-client.html и https://jdbc.postgresql.org/documentation/head/connect.html#ssl

Мое определение источника данных в context.xml:

<Context>
    <Resource name="jdbc/users" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://infra.kodekonveyor.com:5432/users?ssl=true&amp;sslkey=/keys/tomcat/privkey.pk8&amp;sslcert=/keys/tomcat/tomcat.market.pem"
          username="market" maxTotal="20" maxIdle="10"
      maxWaitMillis="-1"/>
</Context>

(Имена файлов, приведенные выше, являются реальными файлами)

Я все еще получаю то же сообщение об ошибке.

Tomcat, похоже, не смотрит ни на один из предоставленных ему файлов. / tmp / foo содержит вывод strace -f всей сессии tomcat

# egrep "\.der|tomcat.market|privkey|pem|pk8" /tmp/foo
13777 read(164, "rimary_root_ca.pem\0\0\1m\305\23\16\334\0\5X.50"..., 8192) = 8192
13777 read(164, "ion_authority_rsa.pem\0\0\1m\305\23\20\355\0\5X"..., 131072) = 26964

(файл с описанным выше дескриптором 164 - это / usr / lib / jvm / java-11-openjdk-amd64 / lib / security/ cacerts)

Это система Ubuntu с установленной libpostgresql-jdbc-java: 9.4.1212-1. У веб-приложения есть такая зависимость:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4.1212</version>
</dependency>

На самом деле я понятия не имею, какой один кот использует для источника данных.

Вопрос: как мне сообщить Tomcat, что существуют клиентские сертификаты и где они находятся?

1 Ответ

2 голосов
/ 21 октября 2019

Проблема заключалась в том, что jar postgres был слишком стар.

Удаление libpostgresql-jdbc-java из системы, загрузка и установка 42.2.8 из https://jdbc.postgresql.org/download.html (я не смог найти maven координатыдля этого) решил проблему не найти сертификат.

Я также должен был добавить root.crt в .postgresql, но из журнала ошибок это было просто.

Теперь проблема в том, чтозакрытый ключ не может быть прочитан, потому что ни один поставщик безопасности не понимает его. См. , чтобы настроить tomcat / hibernate, чтобы иметь поставщика криптографии, поддерживающего 1.2.840.113549.1.5.13 .

...