对sun.security.pkcs11.SunPKCS11的访问限制

Mar*_*lze 15 java security provider smartcard pkcs#11

我正在尝试设置PKCS11提供程序来访问智能卡.我在我的系统上安装了一个PKCS11库,并按照Java PKCS#11参考指南中的说明进行操作.在引用中,它们只是创建一个实例,sun.security.pkcs11.SunPKCS11并将配置文件的名称传递给构造函数.当我尝试编译以下代码时

Provider p = new sun.security.pkcs11.SunPKCS11("pkcs11.cfg");
Security.addProvider(p);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误.

访问限制:由于对所需库的限制,无法访问构造函数SunPKCS11(String)/usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/ext/sunpkcs11.jar

我究竟做错了什么?我在Ubuntu x86下使用Eclipse 3.5和Java SE 1.6.

最好的祝福.

Rob*_*ert 21

查看项目的属性并打开Libraries选项卡.我假设您已设置JRE System Library为执行环境.将其更改为工作区JRE或手动选择特定的JRE.

背景:通过选择执行环境,您说您要编写符合Java API的应用程序.该类sun.security.pkcs11.SunPKCS11位于sun包中,它将其标记为Sun Java实现的专有,并且不是标准Java API的一部分.


小智 7

转到项目属性,Java Build Path窗格,然后展开JRE System Library条目.单击" 访问规则"并单击"编辑..."按钮.添加一个访问规则,使规则模式可访问sun/security/pkcs11/**.这将使Eclipse停止抱怨.


Chu*_*uck 6

如果您使用a,还有另一个原因64 bit runtime on Windows.在这种情况下,根本不存在必要的类.

解决方案:使用32位运行时.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6880559


小智 5

据我了解,在 Java 中使用 PKCS#11 令牌有两种方法:使用 Sun API 和使用一些专有实现。每个都有其优点和缺点。Sun'API 的主要优点是它将 PKCS#11 令牌映射到常规密钥库。因此,BouncyCastle 可以访问令牌中的私钥,而无需实际弄清楚它正在与硬件设备进行交互。此外,任何本机依赖项都已与 Sun 的 JVM 捆绑在一起,您不必担心在不同平台上移植或支持本机代码。主要缺点是它不是标准的,因此不能保证您可以在任何 JVM 上找到它。商业 API(请参阅 IAIK 的 PKCS11 包装器)很好,甚至是开源的,但它们有两个缺点:它们是为了与另一个 API(您必须付费...)一起使用,因此它们不会公开令牌作为 KeyStore,您无法透明地使用 BouncyCastle,并且它们有一个您必须维护和分发的本机组件。如果您必须在浏览器中使用 PKCS#11,您就会知道那是多么痛苦......