【发布时间】:2019-10-21 13:11:53
【问题描述】:
我想使用 jndi 从 tomcat 中的 servlet 连接到 postgresql 服务器。
我已使用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 der-encrypted pk8 格式的客户端私钥
- postgresql.key pem 格式的客户端私钥
(这些是指向真实文件的符号链接) 我可以毫无问题地用psql连接数据库。
但是在 tomcat 中我收到以下异常:
org.postgresql.util.PSQLException: FATAL: connection requires a valid client certificate
我确实读过Providing Certificates to Tomcat for 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 包含整个 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 有客户端证书以及它们在哪里?
【问题讨论】:
标签: postgresql ssl tomcat jndi