Я хочу подключиться к серверу 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&sslkey=/keys/tomcat/privkey.pk8&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, что существуют клиентские сертификаты и где они находятся?