【问题标题】:providing certificates to tomcat jndi connection to postgresql为 tomcat jndi 提供证书到 postgresql 的连接
【发布时间】: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 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 有客户端证书以及它们在哪里?

【问题讨论】:

    标签: postgresql ssl tomcat jndi


    【解决方案1】:

    问题是 postgres jar 太旧了。

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

    我还必须将 root.crt 添加到 .postgresql,但从错误日志来看很简单。

    现在的问题是无法读取私钥,因为没有安全提供者理解它。见configure tomcat/hibernate to have a cryptographic provider supporting 1.2.840.113549.1.5.13

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 2010-12-09
      • 2011-12-28
      • 2019-09-03
      • 2013-12-21
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      相关资源
      最近更新 更多