Ограничение доступа на sun.security.pkcs11.SunPKCS11
Я пытаюсь настроить поставщика PKCS11 для доступа к смарт-карте.
Я установил в свою систему библиотеку PKCS11 и выполнил инструкции в Справочник по Java PKCS # 11.
В ссылке они просто создают экземпляр sun.security.pkcs11.SunPKCS11
и передают имя конфигурационного файла конструктору.
Когда я пытаюсь скомпилировать следующий код
Provider p = new sun.security.pkcs11.SunPKCS11("pkcs11.cfg");
Security.addProvider(p);
Я получаю следующую ошибку.
Ограничение доступа: конструктор SunPKCS11 (String) недоступен из-за ограничения на требуемую библиотеку /usr/lib/jvm/java -6-sun-1.6.0.24/jre/lib/ext/sunpkcs11.jar
Что я делаю неправильно?
Я использую Eclipse 3.5 с Java SE 1.6 под Ubuntu x86.
С уважением.
Ответы
Ответ 1
Просмотрите свойства проектов и откройте вкладку Libraries
. Я предполагаю, что вы установили JRE System Library
в среду выполнения. Измените его на рабочую область JRE или вручную выберите конкретную JRE.
Фон:
Выбирая среду исполнения, вы говорите, что хотите написать приложение, совместимое с Java API. Класс sun.security.pkcs11.SunPKCS11
находится в пакете sun, который отмечает его как проприетарную реализацию Sun Java и не является частью стандартного Java API.
Ответ 2
Перейдите к свойствам вашего проекта, панели "Путь сборки Java" и разверните запись в системной библиотеке JRE. Нажмите "Правила доступа" и нажмите кнопку "Изменить...". Добавьте правило доступа, в котором Доступно шаблон правила солнце/безопасность/pkcs11/**. Это заставит Eclipse перестать ныть.
Ответ 3
Есть еще одна причина, если вы используете 64 bit runtime on Windows
. В этом случае необходимые классы просто отсутствуют.
Решение. Используйте 32-разрядную среду выполнения.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6880559
Ответ 4
Причиной этой ошибки являются определенные классы, которые предположительно могут использоваться Sun JVM, и с более новыми версиями Eclipse была введена контрольная проверка, чтобы предупредить разработчика о неправильном/незаконном использовании классов.
В другой потоке stackoverflow рекомендуется использовать реализацию Bouncy Castle.
Странная проблема с использованием sun.security.pkcs11.SunPKCS11: Указанная процедура не найдена?
Ответ 5
Насколько я понял, существует два способа использования токенов PKCS # 11 в Java: использование Sun API и использование некоторой проприетарной реализации. У каждого есть свои преимущества и недостатки.
Главным преимуществом Sun'API является то, что он отображает токены PKCS # 11 на обычные KeyStores. Таким образом, BouncyCastle может получить доступ к закрытым ключам в токене, фактически не выясняя, что он взаимодействует с аппаратным устройством. Более того, любая нативная зависимость уже связана с Sun JVM, и вам не нужно беспокоиться о переносе или поддержке собственного кода на разных платформах. Основной недостаток заключается в том, что он нестандартен, поэтому вам не гарантировано найти его на любом JVM.
Коммерческие API (см. Оболочку IAIK PKCS11) являются хорошими и даже открытыми источниками, но у них есть два недостатка: они созданы для работы с другим API (который вам нужно заплатить за...), поэтому они не выставляют токен как KeyStore, и вы не можете использовать BouncyCastle прозрачно, и у них есть собственный компонент, который вы должны поддерживать и распространять. Если вам нужно работать с PKCS # 11 в браузере, вы знаете, какая боль...