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

Posted

技术标签:

【中文标题】sun.security.pkcs11.SunPKCS11的访问限制【英文标题】:Access restriction on sun.security.pkcs11.SunPKCS11 【发布时间】:2011-07-07 12:32:40 【问题描述】:

我正在尝试设置 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。

最好的问候。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

从 JRE 系统库更改为工作区 JRE 导致警告消失。谢谢!【参考方案5】:

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

另一个 *** 线程建议使用 Bouncy Castle 实现。 Weird problem using sun.security.pkcs11.SunPKCS11: The specified procedure could not be found?

【讨论】:

但是当不能使用这个类时,为什么在参考指南中使用它?动态加载 PKCS 11 提供程序的合法方式是什么? 我已经阅读了这篇文章。但是在这篇文章permalink.gmane.org/gmane.comp.encryption.bouncy-castle.devel/… 我读到Bouncycastle 不支持PKCS11。 Bouncy Castle 是另一种 Java 加密提供程序和库,这就是为什么它不受 Oracle (Sun) 的“开箱即用”使用限制。

以上是关于sun.security.pkcs11.SunPKCS11的访问限制的主要内容,如果未能解决你的问题,请参考以下文章

升级Java后无法找到Sun.security