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

17

我正在尝试设置一个PKCS11提供程序来访问智能卡。 我在我的系统上安装了一个PKCS11库,并按照Java PKCS#11参考指南中的说明进行操作。 在参考文献中,他们只是创建了一个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下使用Java SE 1.6的Eclipse 3.5。
最好的问候。
5个回答

24

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

背景说明: 通过选择执行环境,您表明希望编写符合Java API标准的应用程序。类sun.security.pkcs11.SunPKCS11位于sun软件包中,这意味着它是Sun Java实现的专有内容,不属于标准Java API的一部分。


1
将JRE系统库更改为工作区JRE后,警告消失了。谢谢! - Marc-Christian Schulze
没有对我起作用。 - sssvrock
@sssvrock 你还在使用Java 1.6吗?因为这个答案是专门针对那个版本的。对于更新的Java版本(特别是Java 11+),你很可能需要不同的方法。 - Robert

9

前往项目属性,选择Java构建路径选项卡,展开JRE系统库条目。点击访问规则并点击编辑按钮。添加一个访问规则,使sun/security/pkcs11/**成为可访问的规则模式。这将使Eclipse停止抱怨。


6

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

4

1
但是当不适合使用这个类时,为什么在参考指南中还要使用它?动态加载PKCS 11提供程序的非法方式是什么? - Marc-Christian Schulze
我已经阅读了这篇文章。但是在这篇文章http://permalink.gmane.org/gmane.comp.encryption.bouncy-castle.devel/2060中,我读到Bouncycastle不支持PKCS11。 - Marc-Christian Schulze
Bouncy Castle是一种替代的Java加密提供程序和库,因此它不受Oracle(Sun)在“开箱即用”方面的限制。 - Fa11enAngel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接