【发布时间】:2019-10-21 14:44:49
【问题描述】:
在配置带有 jndi 数据源的 tomcat 以使用 ssl 身份验证连接到 postgres 服务器时(请参阅providing certificates to tomcat jndi connection to postgresql),我遇到以下错误:
[main] WARN org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata : Cannot create PoolableConnectionFactory (Could not find a java cryptographic algorithm: Cannot find any provider supporting 1.2.840.113549.1.5.13.)
(这是初始化时的警告,但当我实际尝试使用连接时,我看到的与阻止访问数据库的错误相同)。
基于此答案:Reading PKCS8 in PEM format: Cannot find provider 我已尝试通过添加org.bouncycastle.jce.provider.BouncyCastleProvider 作为第一个安全提供程序来修改/usr/lib/jvm/java-11-openjdk-amd64/conf/security/java.security。我还尝试将 jar bcprov-jdk15on-1.64.jar 添加到 /usr/lib/jvm/java-11-openjdk-amd64/lib 和 /usr/share/java(任何地方都没有 lib/ext 目录)。
问题依然存在。
我应该如何告诉将 Bouncy Castle 安全提供程序用于 java 运行时、tomcat 或休眠?
更新: 也尝试安装libbcprov-java并在java.security中设置安全提供程序,但没有成功。
【问题讨论】:
-
该异常消息没有说明它想要什么对象 (API)。正如我在您链接的 A 中所说,该 OID 是 PBES2 的“外部”(通用)OID。它不是一个实际的方案,也不是由标准提供者 或 Bouncy 实现的方案,但标准 SunJCE (not Bouncy) 确实实现了它(作为 @ 的别名987654329@)为
AlgorithmParameters(参数化实际方案)。您是否或能否获得完整的堆栈跟踪,或者至少是前 10 名左右?如果它被休眠吞没,请尝试一个独立的程序,它只连接相同的驱动程序和连接字符串。 ... -
... 或者作为一种解决方法,您可以将密钥更改为单级方案;原来的 PKCS5v1 方案都被破坏了,但是 PKCS12 方案 pbeWithSHA1And3-KeyTripleDES-CBC 仍然可以接受,甚至相当普遍。最后,是的,lib/ext 从 java 9 开始被删除;现在您可以在类路径中放置一个像 bcprov 这样的附加组件,或者如果您真的想要在 JRE 中使用它,请使用 jlink 创建一个“定制的”JRE。
-
您可以在此处找到完整的堆栈跟踪:github.com/pgjdbc/pgjdbc/issues/1585 据我了解,SunJCE 确实实现了它,但不知道 oid,而 Bouncy 实现了它。如果我能理解如何修改密钥,我会的。我已经将它转换为 pkcs-8,但它没有帮助。