有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ColdFusion 10中的java BouncyCastle库

我一直在尝试让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 update 13)的机器上,createObject语句失败了,因为它找不到PemReader类。我已经用谷歌搜索了一下我的眼睛,找不到任何版本的CF中包含的关于BouncyCastle的文档——除了CF10 EULA中关于BouncyCastle的条款

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


共 (1) 个答案

  1. # 1 楼答案

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

    BouncyCastle提供程序包中的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() );