我有一个在我的开发MacBook Pro上运行良好的测试,但无法在持续集成的TeamCity服务器中运行.
错误如下:
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
Run Code Online (Sandbox Code Playgroud)
开发盒和TeamCity都使用Java 1.6,我使用BouncyCastle库来满足特殊的AES加密需求.
代码如下:
private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
Security.addProvider(new BouncyCastleProvider());
SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
return cipher.doFinal(info.getBytes("UTF-8"));
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
看起来根据所选答案,我必须在我的TeamCity安装上修改一些东西,它可能会影响一些用户安装 - 所以它不是一个好选择我必须切换到另一个加密库来做到这一点没有限制.所以充满弹性的城堡可能会有所帮助.
更新2
我实际上切换到使用BouncyCastle来避免这种限制.请注意,这仅适用于直接使用自己的BC类,而不是BC提供程序.
我已经尝试过以下问题的答案:
使用bouncycastle / spongycastle读取加密的私钥
但是由于我调用时我的加密密钥已编码为DER
Object object = pemParser.readObject();
Run Code Online (Sandbox Code Playgroud)
对象为null。
我可以使用openssl的命令将其转换为PEM(它也会解密密钥)
openssl pkcs8 -inform der -in pkey.key -out pkey.pem
Run Code Online (Sandbox Code Playgroud)
但我需要读取其原始文件中的密钥
在使用 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.)
Run Code Online (Sandbox Code Playgroud)
(这是初始化时的警告,但是当我实际尝试使用连接时,我看到与阻止访问数据库的错误相同)。
基于这个答案:Reading PKCS8 in PEM format: Cannot find provider我尝试/usr/lib/jvm/java-11-openjdk-amd64/conf/security/java.security通过添加org.bouncycastle.jce.provider.BouncyCastleProvider为第一个安全提供程序来进行修改。我还尝试将 jar bcprov-jdk15on-1.64.jar 添加到/usr/lib/jvm/java-11-openjdk-amd64/lib和/usr/share/java(任何地方都没有 lib/ext 目录)。
问题仍然存在。
我应该如何告诉对 java 运行时、tomcat 或 hibernate 使用 Bouncy Castle 安全提供程序?
更新:还尝试安装 …
java ×3
aes ×1
bouncycastle ×1
cryptography ×1
der ×1
hibernate ×1
jce ×1
pem ×1
ssl ×1
tomcat ×1