我正在尝试将BouncyCastle添加为Windows XP Pro上的安全提供程序,因此我可以使用它根据说明here向Android应用程序添加一些证书。不幸的是我无法添加提供商。
我已经:
C:\Program Files\Java\jre6\lib\ext\
。C:\Program Files\Java\jre6\lib\ext\bcprov-jdk16-146.jar
添加到%CLASSPATH%
。security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
添加到java.security(7是订单中的下一个int)。当我跑步时:
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,或者是否有一些我错过的步骤会让提供商坚持下去?
谢谢!
答案 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命令。