将 Tomcat/Hibernate 配置为具有支持 1.2.840.113549.1.5.13 的加密提供程序



在配置带有 jndi 数据源的 tomcat 以使用 ssl 身份验证连接到 postgres 服务器时(请参阅向 tomcat jndi 连接到 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.)

(这是初始化时的警告,但是当我实际尝试使用该连接时,我看到的相同错误阻止访问数据库(。

基于此答案: 以 PEM 格式读取 PKCS8:找不到提供程序 我尝试通过将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或hibernate?

更新: 还尝试安装 libbcprov-java 并在 java.security 中设置安全提供程序,但没有成功。

我认为这足以回答,这比评论更具可读性。而且更安全。

SunJCE 和 bcprov 都为多个 PBES2 系列密码(以及 PBKDF2 作为组件(实现了Cipher实例,但都没有通过名称或 OID 实现 PBES2 的Cipher,因为 PBES2 不是一个密码,它是一个(大(系列。正如我所指出的,SunJCE 确实通过 OID 和名称实现了 PBES2 的AlgorithmParameters。(Bouncy当然在内部实现了PBES2参数,在我看来,它们可以在直接或"轻量级"API中使用,但它不会通过提供程序SPI公开它们。

您的密钥文件采用PKCS8 加密格式;问题是 PKCS8 加密可以使用许多加密方案(密码(,包括 PBES2 系列,它不由一个 OID 标识(如来自 PKCS5v1 和 PKCS12 的较旧/更简单的(,而是三个:"外部"PBES2、PBKDF2(带有派生参数(和底层对称密码(使用加密参数(。

假设 https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/ssl/LazyKeyManager.java 代码是正确的(行号 205 确实与您的堆栈跟踪匹配(,这显然不是为处理两级 (PBES2( 情况而设计的。但是,它确实会首先尝试未加密的 PKCS8,并且只有在失败时才尝试使用一个 OID 标识的方案加密的 PKCS8。因此,如果在您的环境中拥有未加密的密钥文件是可以接受的,那应该有效,我建议使用 PKCS8 加密的单级方案,如 PKCS12 的 pbeWithSHAAnd3-KeyTripleDES-CBC - 在检查时我看到 SunJCE 实际上命名了 PBEWithSHA1AndDESede,但使用正确的 OID 1.2.840.113549.1.12.1.3 这才是这里最重要的。(bcprov 使用标准名称,但大写除外 - JCA 不区分大小写。

根据创建密钥文件的软件或进程,可以对其进行调整以生成所需的格式。如果没有,并且您拥有或获得OpenSSL,它可以处理许多(大多数(PKCS8选项:

# we need an intermediate PEM file; for safety (PB)encrypt it
openssl pkey <p8unusable.der -inform d -aes256 >temp.pem
# to unencrypted PKCS8
openssl pkcs8 -topk8 <temp.pem -outform d -nocrypt >p8unenc.der
# to encrypted PKCS8 using single-level PKCS12 scheme
openssl pkcs8 -topk8 <temp.pem -outform d -v1 pbeWithSHA1And3-KeyTripleDES-CBC >p8encone.der
# note OpenSSL spells SHA1 where PKCS12 had SHA (which was technically wrong)
# OTOH OpenSSL implies this is PKCS5v1 which it isn't. Bleah.
rm temp.pem # or erase or whatever

最新更新