17

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

Provider p = new sun.security.pkcs11.SunPKCS11("pkcs11.cfg");
Security.addProvider(p);

我收到以下错误。

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

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

最好的祝福。

4

5 回答 5

22

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

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

于 2011-03-02T19:10:42.870 回答
9

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

于 2011-05-31T15:47:26.590 回答
6

如果您使用64 bit runtime on Windows. 在这种情况下,根本不存在必要的类。

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

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

于 2013-05-17T06:45:16.470 回答
5

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

于 2011-03-17T08:35:44.557 回答
4

该错误的原因是某些类仅被假定为由 Sun JVM 使用,并且在较新版本的 Eclipse 中进行了警告检查,以警告开发人员不正确/非法使用类。

另一个 stackoverflow 线程建议使用 Bouncy Castle 实现。 使用 sun.security.pkcs11.SunPKCS11 的奇怪问题:找不到指定的程序?

于 2011-03-02T19:09:24.340 回答