Подтвердить что ты не робот

Проблемы с установкой 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 или может быть какой-то шаг, который я пропустил, что заставит провайдера придерживаться?

Спасибо!

4b9b3361

Ответ 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.