java - ColdFusion 10 中的 BouncyCasSTLe 库

标签 java coldfusion bouncycastle coldfusion-10

我一直在尝试让 RSA 私钥加密在 ColdFusion 10 中工作,并安装了 BouncyCaSTLe 库,因为它支持我的应用程序所需的加密模式。尝试使用 JavaLoader 加载库会导致错误(“类位于 bootclasspath 上”和“JCE 无法验证提供程序 BC”),因此我必须静态安装它...

将 jar 复制到 %CF_ROOT%/jre/lib/ext/ 并将以下内容添加到 %CF_ROOT%/jre/lib/security/java.security:

security.provider.<N>=org.bouncycastle.jce.provider.BouncyCastleProvider

当时我没有意识到,我还从代码中删除了该库,但使用该库的语句仍然有效:

var privateKey = createObject("java", "org.bouncycastle.util.io.pem.PemReader").init(
    createObject("java", "java.io.FileReader").init(LOCAL.privateKeyPath)
).readPemObject().getContent();

因此,要么我在 ColdFusion 安装中永久安装了 BouncyCaSTLe,要么它包含在 ColdFusion 中。此后,我删除了静态提供程序安装,并使用“BC”提供程序进行加密,无需修改即可继续工作。如果 BouncyCaSTLe 与 CF 捆绑在一起,那就太好了,但在另一台运行同样更新版本的 ColdFusion(CF10 更新 13)的计算机上,createObject 语句会失败,因为它找不到 PemReader 类。我用 google 搜索了一下,找不到任何关于 BouncyCaSTLe 包含在任何版本的 CF 中的文档 - 除了 CF10 EULA 中有关 BouncyCaSTLe 的条款。

问题是:CF10 中是否包含 BouncyCaSTLe?如果包含,如何确保它已启用?

最佳答案

虽然我仍然不清楚为什么两台具有相同版本 CF 和相同 java 包的机器会在该包中包含的类中存在差异,但我确实找到了解决方法。

org.bouncycastle.util.io.pem.PemReader BouncyCaSTLe Provider 包中的类是已弃用的 org.bouncycastle.openssl.PEMReader 的替代品。 BouncyCaSTLe PKIX/OpenSSL 包中的类。由于CF10附带了相对较旧的BC版本(v1.39-jdk1.4),因此它仍然包含已弃用的类。将上面的代码替换为以下代码更正了问题...

var privateKeyFile = createObject("java", "java.io.FileReader").init("myPrivateKey.pem");
var privateKey = createObject("java", "org.bouncycastle.openssl.PEMReader").init( privateKeyFile ).readObject().getPrivate().getEncoded();
privateKeyFile.close();

它还有显式关闭文件的好处(尽管这总是可能的)。

注意:出现早期问题的计算机也未加载 BouncyCaSTLe 安全提供程序。它似乎在每台机器上都可用,但并不总是加载,因此如果尚未加载,我必须显式加载它:

var securityProviders = createObject("java", "java.security.Security").getProviders();
var providerInstalled = false;
for( var provider IN securityProviders ){
    if( provider.getName() eq "BC" ){
        providerInstalled = true;
        break;
    }
}
if( not providerInstalled )
    createObject("java", "java.security.Security")
        .addProvider( createObject("java", "org.bouncycastle.jce.provider.BouncyCastleProvider").init() );

关于java - ColdFusion 10 中的 BouncyCasSTLe 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25027957/

相关文章:

c# - 在 C# 中使用 PCKS5 解密填充的 AES/ECB 时遇到问题

java - 在Java中通过IP连接到服务器时出现ConnectException

java - 是否可以使用 Java ImageIO 从 InputStream 读取多个图像?

ColdFusion - 针对 IPR(知识产权)预编译的替代方案

c# - PGP 压缩和加密

c# - 为服务器和客户端使用不同的加密库

java - 将 Java double 映射到 String 并保留排序顺序

java - 每4个字符将char放入java字符串中

coldfusion - 如何使用cfimage将图像保存为渐进式jpg?

coldfusion - 将结构转换为查询 Coldfusion