До Java 8 поставщик SunPKCS11 был загружен следующим образом:
Provider provider = new sun.security.pkcs11.SunPKCS11 (new ByteArrayInputStream (configFile.getBytes ());
Security.addProvider (provider);
"configFile" - это строка с параметрами конфигурации. Таким образом, если приложение должно работать с несколькими подключенными смарт-картами, оно может создавать несколько поставщиков. Для доступа к каждому провайдеру было использовано имя "SunPKCS11-", за которым следует имя, указанное в конфигурации.
В Java 8 класс sun.security.pkcs11.SunPKCS11
был удален в JDK. Итак, мне пришлось запрограммировать предыдущий вызов путем отражения.
Работа провайдера PKCS # 11 в Java 9 кажется совсем другой:
-
Конструктор SunPKCS11 был изменен на пустой. Конфигурация загружается методом "configure", поэтому обязательно, что она находится в файле на диске, и я больше не могу загружать ее через поток в строку.
-
Если мы попытаемся использовать отражение, появятся следующие предупреждения:
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by PruebaTarjeta (file:/C:/temp/pkcs11java9/classes/) to constructor sun.security.pkcs11.SunPKCS11() WARNING: Please consider reporting this to the maintainers of PruebaTarjeta WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
- В Java 9 поставщик SunPKCS11 автоматически создается и входит в список поставщиков криптографии. Его можно получить из списка и настроить. Проблема в том, что в список может быть только один поставщик PKCS # 11. Документация Java 9 указывает, что мы можем получить провайдера PKCS # 11 с "SunPKCS11-", за которым следует имя, указанное в конфигурации, но оно не правда. Если мы посмотрим на список поставщиков, то единственным является "SunPKCS11", поэтому у меня не может быть одного поставщика на смарт-карту.
Случалось ли это с кем-то еще? Любое решение?