Проблемы с установкой BouncyCastle
Я пытаюсь добавить BouncyCastle в качестве поставщика безопасности в Windows XP Pro, поэтому я могу использовать его для добавления некоторых сертификатов в приложение для 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, но изменил его на предупреждение по предложению здесь. Теперь, когда я запускаю код, он показывает BouncyCastle в списке поставщиков, но он не встает после завершения программы.
Я уверен, что это должно быть выполнимо, но я ошеломлен тем, как заставить этого парня установить достаточно долго, чтобы запустить keytool, используя его. Можно ли запустить keytool с помощью java API или может быть какой-то шаг, который я пропустил, что заставит провайдера придерживаться?
Спасибо!
Ответы
Ответ 1
В параметре -providerName
требуется имя поставщика ( "BC", в данном случае), а не имя класса. Альтернативный вариант -providerClass
требует имени класса, и он полезен, если провайдер не зарегистрирован в файле java.security
.
Когда вы регистрируете провайдера "программно", это временно. Ваша программа должна перерегистрировать своего провайдера каждый раз, когда он запускается. Вы не сможете использовать этот подход, если ваша цель - сделать BouncyCastle доступным для keytool
.
Поскольку вы уже установили провайдера (поместив архив в lib/ext
и указав его в java.security
), использование опции -providerName BC
, вероятно, является самым простым решением. Кроме того, вы можете использовать опцию -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider
.
Кстати, вы не должны использовать переменную среды CLASSPATH
. Библиотеки в lib/ext
уже находятся в пути класса.
Если после исправления параметров вы все равно получите NoSuchProviderException
(используя -providerName
) или ClassNotFoundException
(используя -providerClass
), убедитесь, что вы используете правильную копию keytool
. То есть при выполнении укажите полный путь keytool
, а не полагайтесь на свою переменную PATH
. Убедитесь, что путь относится к JRE, в который был установлен BouncyCastle. Нередко система имеет несколько JRE и JDK.
Ответ 2
Если вы находитесь в Windows, не забудьте запустить командную строку как администратор для ввода команд keytool.