为tomcat jndi与Postgresql的连接提供证书

时间:2019-10-21 13:11:53

标签: postgresql ssl tomcat jndi

我想使用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加密的pk8格式的客户端私钥
  • postgresql.key pem格式的客户端私钥

(这些是指向实际文件的符号链接) 我可以用psql毫无问题地连接数据库。

但是在tomcat中,我收到以下异常:

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

我确实读过Providing Certificates to Tomcat for Postgres Connectionhttps://jdbc.postgresql.org/documentation/head/ssl-client.htmlhttps://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包含整个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客户端证书及其位置?

1 个答案:

答案 0 :(得分:2)

问题是postgres罐子太旧了。

从系统中删除libpostgresql-jdbc-java,从https://jdbc.postgresql.org/download.html下载并安装42.2.8(我找不到它的maven坐标)解决了找不到证书的问题。

我还必须将r​​oot.crt添加到.postgresql,但是从错误日志中来看,它很简单。

现在的问题是,由于没有安全提供程序可以理解,因此无法读取私钥。参见configure tomcat/hibernate to have a cryptographic provider supporting 1.2.840.113549.1.5.13