BouncyCastle安装问题

时间:2011-05-06 16:11:33

标签: java bouncycastle

我正在尝试将BouncyCastle添加为Windows XP Pro上的安全提供程序,因此我可以使用它根据说明here向Android应用程序添加一些证书。不幸的是我无法添加提供商。

我已经:

  1. 将提供商下载到C:\Program Files\Java\jre6\lib\ext\
  2. C:\Program Files\Java\jre6\lib\ext\bcprov-jdk16-146.jar添加到%CLASSPATH%
  3. security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider添加到java.security(7是订单中的下一个int)。
  4. 当我跑步时:

    keytool -import -v -trustcacerts -alias 0 -file mycert.crt -keystore mystore.bks -storetype BKS -providerName org.bouncycastle.jce.provider.BouncyCastleProvider -storepass mypassword 
    

    我收到以下错误消息:

    keytool error: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider
    

    我也尝试过动态添加它:

    import java.security.Provider;
    import java.security.Security;
    import java.util.Enumeration;
    
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    public class BouncyCastleMain {
    
        public static void main(String[] args) throws Exception {
            Security.addProvider(new BouncyCastleProvider()); // add it
            try { // list them out
                Provider p[] = Security.getProviders();
                for (int i = 0; i < p.length; i++) {
                    System.out.println(p[i]);
                    for (Enumeration<?> e = p[i].keys(); e.hasMoreElements();)
                        System.out.println("\t" + e.nextElement());
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    

    首先,我在编译java类时遇到了访问错误,但根据建议here将其更改为警告。现在,当我运行代码时,它会在提供程序列表中显示BouncyCastle,但在程序完成后它不会停留。

    我确信它一定是可行的,但是我对如何安装这个人足够长时间来运行keytool使用它感到困扰。是否可以通过Java API运行keytool,或者是否有一些我错过的步骤会让提供商坚持下去?

    谢谢!

2 个答案:

答案 0 :(得分:25)

-providerName选项需要提供商名称(在本例中为“BC”),而不是类名。另一个选项-providerClass确实需要一个类名,当提供程序未在java.security文件中注册时,它很有用。

当您以“编程方式”注册提供程序时,它只是暂时的。您的程序必须在每次运行时重新注册其提供程序。如果您的目标是让{1}}可以使用BouncyCastle,则无法使用此方法。

由于您已经安装了提供程序(将归档文件放在keytool中并将其列在lib/ext中),因此使用java.security选项可能是最简单的解决方案。或者,您可以使用-providerName BC选项。

顺便说一句,您不应该使用-providerClass org.bouncycastle.jce.provider.BouncyCastleProvider环境变量。 CLASSPATH中的库已经在类路径上了。

如果在更正选项后仍然获得lib/ext(使用NoSuchProviderException)或-providerName(使用ClassNotFoundException),请确认您使用的是正确的副本-providerClass。也就是说,在执行时,请指定keytool的完整路径,而不是依赖于keytool变量。确保路径引用安装了BouncyCastle的JRE。系统拥有多个JRE和JDK并不罕见。

答案 1 :(得分:1)

如果您使用的是Windows,请不要忘记以管理员身份启动命令行以输入keytool命令。