我想使用jndi从tomcat中的servlet连接到postgresql服务器。
我已经添加服务器证书到信任库使用keytools-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包含以下文件:
(这些是指向真实文件的符号链接)我可以毫无问题地将数据库与psql连接起来。
但是在tomcat中,我收到以下异常:
org.postgresql.util.PSQLException: FATAL: connection requires a valid client certificate
我确实阅读了为Postgres连接提供Tomcat证书,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包含整个tomcat会话的strace-f输出
# 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。webapp有以下依赖项:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1212</version>
</dependency>
实际上,我不知道tomcat使用哪个数据源。
问题:如何告诉Tomcat有客户端证书以及它们在哪里?
问题是postgresjar太老了。
从系统中删除libpostgresql-jdbc-java,从https://jdbc.postgresql.org/download.html下载并安装42.2.8(我找不到它的maven坐标)解决了找不到证书的问题。
我还必须将root. crt添加到.postgresql,但从错误日志来看,这很简单。
现在的问题是无法读取私钥,因为没有安全提供程序理解它。请参阅配置tomcat/hibernate以拥有支持1.2.840.113549.1.5.13的加密提供程序。