我一直在尝试在ColdFusion 10中使用RSA私钥加密并安装BouncyCastle库,因为它支持我的应用程序所需的加密模式。尝试使用JavaLoader加载库会导致错误(" Class位于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中。我已经使用&#34; BC&#34;删除了静态提供程序安装和加密。提供商继续工作而不进行修改。如果BouncyCastle与CF捆绑在一起然后很棒,但在运行同样更新版本的ColdFusion(CF10更新13)的另一台机器上,createObject语句失败,因为它无法找到PemReader类。我用谷歌搜索了我的眼睛血腥,无法找到关于BouncyCastle的任何文件被包含在任何版本的CF中 - 除了关于CF10 EULA中关于BouncyCastle的条款。
问题是:BouncyCastle是否包含在CF10中,如果是,我该如何确保它已启用?
答案 0 :(得分:2)
虽然我还不清楚为什么两台具有相同版本的CF且具有相同版本的相同java软件包的机器会在该软件包中包含的类中存在差异,但我确实找到了解决方法。
BouncyCastle Provider包中的org.bouncycastle.util.io.pem.PemReader
类是BouncyCastle PKIX / OpenSSL包中已弃用的org.bouncycastle.openssl.PEMReader
类的替代品。由于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() );