Ограничение доступа на 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 в браузере, вы знаете, какая боль...