我对Java-NSS库感兴趣,而且我正在阅读Sun的P11指南.我对以下内容感到困惑:
使用PKCS12密钥库和PKCS11密钥库有什么区别?
密钥库只是一个密钥库,对吧?有什么不同吗?它们可以在任何方面互换使用吗?
在Java 8之前,SunPKCS11提供程序的加载方式如下:
Provider provider = new sun.security.pkcs11.SunPKCS11 (new ByteArrayInputStream (configFile.getBytes ()));
Security.addProvider (provider);
Run Code Online (Sandbox Code Playgroud)
configFile是带有配置参数的String.因此,如果应用程序需要使用多个连接的智能卡,它可以创建多个提供程序.要访问每个提供程序,使用的名称是"SunPKCS11-",后跟我们在配置中指示的名称.
在Java 8中,sun.security.pkcs11.SunPKCS11该类已在JDK中删除.所以,我不得不通过反思来编程前一个调用.
Java 9中PKCS#11提供程序的操作似乎非常不同:
该SunPKCS11构造已更改为空单.配置由"configure"方法加载,因此必须将它放在磁盘上的文件中,我不能再通过流将其加载到字符串.
如果我们尝试使用反射,则会出现以下警告:
Run Code Online (Sandbox Code Playgroud)WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by PruebaTarjeta (file:/C:/temp/pkcs11java9/classes/) to constructor sun.security.pkcs11.SunPKCS11() WARNING: Please consider reporting this to the maintainers of PruebaTarjeta WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
我正在尝试设置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.
最好的祝福.
由于斯堪的纳维亚国家的法律要求,我们正在为网站创建三因素身份验证.客户使用NetID品牌的浏览器插件在浏览器中执行PKCS#11证书身份验证.智能卡由客户的合作伙伴集中供应.
该主题没有太多的在线资源或教程.有人会有任何指向示例实现或教程的指针如何在Web浏览器中进行PKCS11身份验证?
编辑:找到有关SSL客户端证书
看起来认证方法是SSL客户端证书
我们如何管理用户与智能卡之间的关系?
用户是否向我们提供了他们的公钥,我们对他们进行身份验证?
我们是否需要使用我们自己的证书单独签署/配置每个用户?
是否所有用户智能卡都包含一个"通用"密钥,我们根据提供商证书进行测试?
http://www.impetus.us/~rjmooney/projects/misc/clientcertauth.html
我在ubuntu 11.10上使用OpenJDK(java版"1.6.0_22")运行最新的opensc 0.12.2
我可以阅读我的智能卡(飞天ePass PKI)
pkcs15-tool --dump
Run Code Online (Sandbox Code Playgroud)
现在我尝试使用带有keytool的智能卡:
keytool
-providerClass sun.security.pkcs11.SunPKCS11 \
-providerArg /etc/opensc/opensc-java.cfg \
-keystore NONE -storetype PKCS11 -list
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
keytool error: java.security.KeyStoreException: PKCS11 not found
java.security.KeyStoreException: PKCS11 not found
at java.security.KeyStore.getInstance(KeyStore.java:603)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:621)
at sun.security.tools.KeyTool.run(KeyTool.java:194)
at sun.security.tools.KeyTool.main(KeyTool.java:188)
Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available
at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
at java.security.Security.getImpl(Security.java:696)
at java.security.KeyStore.getInstance(KeyStore.java:600)
... 3 more
Run Code Online (Sandbox Code Playgroud)
当我运行相同的命令时启用调试选项,如下所示:
keytool
-providerClass sun.security.pkcs11.SunPKCS11 \
-providerArg /etc/opensc/opensc-java.cfg \
-keystore NONE -storetype PKCS11 -list \
-J-Djava.security.debug=sunpkcs11
Run Code Online (Sandbox Code Playgroud)
它突然起作用:
... debug infos ...
Enter keystore password:
sunpkcs11: login …Run Code Online (Sandbox Code Playgroud) 我想使用HSM(硬件安全模块)来创建XML文件的签名.我做了一些研究,但现在有点困惑.
你能否澄清一下这些问题:
我通过以下方式初始化了SunPKCS11提供商:
Provider provider = new sun.security.pkcs11.SunPKCS11("path_to_pkcs11.cfg");
Security.addProvider(provider);
Run Code Online (Sandbox Code Playgroud)
然后我使用此提供程序初始化KeyStore以使用密钥进行密码操作.
KeyStore ks = KeyStore.getInstance("PKCS11", provider);
ks.load(null, "password".toCharArray());
Run Code Online (Sandbox Code Playgroud)
完成密码操作后,如何使用PKCS11令牌完成会话?
我试过删除提供程序,但它没有用.
Security.removeProvider("sunPCKS11ProviderName");
Run Code Online (Sandbox Code Playgroud)
下次我尝试与令牌进行通信时,我会从令牌CKR_CRYPTOKI_ALREADY_INITIALIZED中抛出此异常
更新:
我试过了
sun.security.pkcs11.SunPKCS11.logout();
Run Code Online (Sandbox Code Playgroud)
但它也没有用.
我有一个用例,我必须使用PKCS#11 Wrapper和Provider.为了能够使用包装器,我必须最终确定提供者,否则CKR_CRYPTOKI_ALREADY_INITIALIZED 当包装器尝试与令牌通信时,令牌会抛出错误.
更新代码:
我正在使用Sun的PKCS#11 Provider和IAIK的PKCS#11 Wrapper.
public static void providerAndWrapperIssue() throws Exception
{
final String name = "ANY_NAME";
final String library = "LOCATION OF THE TOKENS DLL/SO";
final String slot = "SLOT NUMBER";
// SUN PKCS#11 Provider -------------------------------------------
StringBuilder builder = new StringBuilder();
builder.append("name=" + name);
builder.append(System.getProperty("line.separator"));
builder.append("library=\"" + library + …Run Code Online (Sandbox Code Playgroud) 摘要:当通过OpenSC在PKCS11上使用JCA时,在提取证书时会请求PIN.
我有一个需要使用智能卡签名的应用程序.OpenSC支持智能卡,因此我使用Java内置的pkcs11包装提供程序来使用它.出于功能原因,我需要在没有请求PIN的情况下获取卡中的证书.如果用户最终签名,那么当然需要PIN.
我发现我可以在不提供PIN的情况下从命令行执行此操作:
pkcs11-tool --module C:\WINDOWS\system32\opensc-pkcs11.dll -r -a 50-MDS_Signature -y cert -o p.cer
Using slot 1 with a present token (0x1)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
Oracle的文档明确指出"构建器将根据需要使用先前配置的回调处理程序提示输入密码"(http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html#登录).但是,KeyStore ks0 = ksbuilder0.getKeyStore();即使只提取公共信息(例如证书),我的代码总是请求引脚作为我的电话.
遵循代码的摘录:
private static final String PKCS11_LIB = "C:\\WINDOWS\\system32\\opensc-pkcs11.dll";
private static final String NAME = "OpenSCpkcs11";
private static final String SLOT = "1";
private static final String PIN = "11111111";
private static final String ALIAS = "myCert";
[...]
private static CallbackHandler myCallbackHandler = new CallbackHandler() {
@Override
public void handle(Callback[] callbacks) …Run Code Online (Sandbox Code Playgroud) 码:
String pkcs11cfg = "pkcs11.cfg";
Provider p = new SunPKCS11(pkcs11cfg);
Security.addProvider(p);
KeyStore ks = KeyStore.getInstance("PKCS11", p);
ks.load(null, pin);
System.out.println(ks.size()); // prints 0
Run Code Online (Sandbox Code Playgroud)
CFG:
name = pkcs11Test
library = /usr/local/lib/libsofthsm.so
slot = 1
Run Code Online (Sandbox Code Playgroud)
问题是我有一些密钥对,我用pkcs11-tool添加它们.
softhsm的版本是1.2.1
为什么KeyStore中没有任何别名?如何解决这个问题?
我们编写了一个文档管理系统,并希望使用Web客户端对文档进行数字签名.我们的Java客户端应用程序已经能够应用和检查数字签名,但我们希望甚至可以使用我们的Web客户端进行签名.这是用GWT编写的,因此,当在客户端运行时,它是一个JavaScript应用程序.
我们不想创建Java applet并将其下载到客户端并执行它.我们希望使用浏览器安全设备或浏览器API来签署文档.我们还希望保留完整的文档服务器端,并仅向客户端移动文档哈希.
我们认为这应该可以使用NSS 或npapi/npruntime,但我们没有找到任何关于此的信息.(顺便说一句,在IE中也可以使用npruntime吗?我们应该使用ActiveX来实现与IE相同的结果吗?)
你有什么提示吗?