Насколько я понял, существует два способа использования токенов PKCS # 11 в Java: использование API-интерфейсов Sun и использование некоторой проприетарной реализации.У каждого есть свои преимущества и недостатки.Основным преимуществом Sun'API является то, что он сопоставляет токены PKCS # 11 с обычными хранилищами ключей.Таким образом, BouncyCastle может получить доступ к закрытым ключам токена, фактически не выясняя, взаимодействует ли он с аппаратным устройством.Более того, любая нативная зависимость уже включена в JVM от Sun, и вам не нужно беспокоиться о переносе или поддержке нативного кода на разных платформах.Основным недостатком является то, что он нестандартный, поэтому вы не гарантированно найдете его на любой виртуальной машине Java.Коммерческие API (см. Оболочку PKCS11 от IAIK) хороши и даже имеют открытый исходный код, но у них есть два недостатка: они предназначены для работы с другим API (за который нужно платить ...), поэтому они не предоставляют токенкак KeyStore, и вы не можете использовать BouncyCastle прозрачно, и у них есть собственный компонент, который вы должны поддерживать и распространять.Если вам приходится работать с PKCS # 11 в браузере, вы знаете, что это за боль ...