码:
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中没有任何别名?如何解决这个问题?
所以这就是我想要做的.我有一个硬件令牌,上面有一些证书,我正在编写一个Java应用程序来尝试访问这些证书.我在jre6中使用了SunPKCS11库来获取Windows 32位机器.这是我访问证书的一小部分示例:
String configName = "pkcs.cnf"
String PIN = "123456";
Provider p = new sun.security.pkcs11.SunPKCS11(configName);
Security.addProvider(p);
KeyStore keyStore = KeyStore.getInstance("PKCS11");
char[] pin = PIN.toCharArray();
keyStore.load(null, pin);
Run Code Online (Sandbox Code Playgroud)
它工作得很好,我能够获得证书和一切.现在我试图在64位机器上做同样的事情.但是我试图使用64位jre6库,而且缺少SunPKCS11 jar文件(located in {java.home}/lib/ext.因此,我无法创建SunPKCS11对象.我的问题是,我现在该怎么办?如何使用64位Java库访问令牌上的证书?是否有人为这样的任务写了64位包装器?
我们编写了一个文档管理系统,并希望使用Web客户端对文档进行数字签名.我们的Java客户端应用程序已经能够应用和检查数字签名,但我们希望甚至可以使用我们的Web客户端进行签名.这是用GWT编写的,因此,当在客户端运行时,它是一个JavaScript应用程序.
我们不想创建Java applet并将其下载到客户端并执行它.我们希望使用浏览器安全设备或浏览器API来签署文档.我们还希望保留完整的文档服务器端,并仅向客户端移动文档哈希.
我们认为这应该可以使用NSS 或npapi/npruntime,但我们没有找到任何关于此的信息.(顺便说一句,在IE中也可以使用npruntime吗?我们应该使用ActiveX来实现与IE相同的结果吗?)
你有什么提示吗?
我正在尝试在我控制的客户端和 Web 服务器之间建立 TLS 通道。客户端和服务器都使用我在私有 PKI 方案下创建的证书对自己进行身份验证。客户端密钥和证书存储在 USB 加密狗 HSM 上。Python 是主要的应用程序语言。
我能够使用python-pkcs11AES 加密、HMAC 签名、RSA 签名等包为我的项目执行所有必需的加密操作。但是,我找不到将 pkcs11“绑定”到任何 TLS 库的方法。我的意思是调用处理 pkcs11 层并建立 TLS 通道的函数的“Pythonic”方式。请求不支持 pkcs11。libcurl有PKCS11支持,但它不是在执行pycurl,没有pyopenssl。
我可以使用引擎 api 来执行 openssl 的 s_client CLI 工具:
openssl s_client -engine pkcs11 -verify 2 -CAfile path/to/CA.pem -keyform engine -key "pkcs11:...;object=rsa;type=private" -cert path/to/client-cert.pem -connect localhost:8443
我正在寻找的一个例子:
do_tls_with_pkcs(key=’pkcs11:URL’, cert=’cert.pem’, verify=’CA-cert.pem’)
据我所知,目前还没有这样的图书馆。现在我正在寻找一种解决方法。
我读过,如果 openssl、libp11 和 python 以这种方式编译,则可以抽象所有这些,因此简单的请求调用将通过 HSM,对应用程序代码透明。虽然,我找不到任何关于如何做的材料。
我刚从Java 6升级到Java 7 SDK,现在我的ant build中出现以下错误:
错误:包sun.security.pkcs11不存在
Provider p = new sun.security.pkcs11.SunPKCS11(is);
我正在运行Windows 7 64位.如果我切换回Java 6,我可以正常编译,但这不再是一个选项.我没有太多运气在网上寻找解决方案.有谁知道如何解决这个问题?
以下代码使用PKCS#11设备(智能卡)创建客户端身份验证的SSL上下文.这一切都适用于Java 6:
// Configure the SunPkcs11 provider
String pkcs11config;
pkcs11config = "name = Cryptoki";
pkcs11config += "\nlibrary = /SCDriver/libbit4ipki.dylib";
InputStream confStream = new ByteArrayInputStream(pkcs11config.getBytes());
SunPKCS11 sunpkcs11 = new SunPKCS11(confStream);
Security.addProvider(sunpkcs11);
// Specify keystore builder parameters for PKCS#11 keystores
Builder scBuilder = Builder.newInstance("PKCS11", sunpkcs11, new KeyStore.CallbackHandlerProtection(new PasswordRetriever()));
// Create and init KeyManagerFactory
KeyManagerFactory factory = KeyManagerFactory.getInstance("NewSunX509");
factory.init(new KeyStoreBuilderParameters(scBuilder));
// create and init ssl context
m_ssl_context = SSLContext.getInstance("TLS");
m_ssl_context.init(factory.getKeyManagers(), new TrustManager[] {new PkTrustManager()}, null);
SSLContext.setDefault(m_ssl_context);
Run Code Online (Sandbox Code Playgroud)
该PkTrustManager仅仅是和"空"类,服用任何服务器/客户端证书为好,并PasswordRetriever刚刚经历一个对话框,询问密码(要求我发布这些源代码).在Java 7上,我在ssl上下文的SSL握手期间得到以下异常:
java.security.InvalidKeyException: …Run Code Online (Sandbox Code Playgroud) 我正在开发一个小应用程序,应该使用数字签名和退出来签署文档.签名可以在PKCS#12存档(.pfx文件)中或在智能卡设备上.
使用pfx文件很简单,工作正常.
但是,有时使用智能卡设备,该过程会挂起在Windows 8 PC上.
文档已正确签名,但该过程不会终止.它只是挂起.
我正在使用Sun的PKCS#11提供商 - sun.security.pkcs11.SunPKCS11
基本上我这样做:
SunPKCS11 provider = new SunPKCS11(configuration);
Security.addProvider(provider);
..... some work .....
provider.logout()
Security.removeProvider(provider);
Run Code Online (Sandbox Code Playgroud)
现在......即使我System.exit(0)在main方法结束时调用或抛出异常,我也可以在输出中看到堆栈跟踪,但进程不会终止.
我添加了一个关闭钩子,看它是否被执行,它是,即JVM正试图停止.
悬挂很少发生,仅在Windows 8 PC上发生.尝试使用不同的智能卡,它只发生在使用的卡上cmp11.dll(dll由智能卡供应商提供).
但是,使用相同的dll与智能卡进行通信在Windows 7,XP或某些Windows 8 PC上运行良好
在x86或x64 Windows 8上使用Java 8,Update 45运行它
试图获取一个线程转储来查看挂起的内容:
public static void main(String[] args) {
// do my job, register provider, sign documents, remove provider ...
for(int i = 0; i < 20; ++i) {
System.err.println("Sleep... " + i);
Thread.sleep(2 * 1000);
}
System.err.println("Exiting...");
}
Run Code Online (Sandbox Code Playgroud)
如果我 …
当API返回可变长度的项列表时,PKCS#11 v2.40的作者使用通用模式.在诸如C_GetSlotList和的API中C_GetMechanismList,应用程序应该两次调用API.在第一次调用中,指向a的指针CK_ULONG设置为下次调用时将返回的项目数.这允许应用程序分配足够的内存并再次调用API以检索结果.
该C_FindObjects调用还返回可变数量的项,但它使用不同的范例.该参数CK_OBJECT_HANDLE_PTR phObject设置为结果列表的头部.该参数CK_ULONG_PTR pulObjectCount设置为返回的项目数,确保小于CK_ULONG ulMaxObjectCount.
该标准没有明确说明phObject必须是一个有效的指针,指向足够容纳ulMaxObjectCount CK_OBJECT_HANDLEs 的内存块.
可以将标准解释为应用程序必须悲观地为ulMaxObjectCount对象分配足够的内存.或者,可以将标准解释为PKCS#11实现将分配pulObjectCount CK_OBJECT_HANDLEs,然后应用程序负责释放该内存.然而,后来的解释似乎是可疑的,因为标准中没有其他地方PKCS#11的实现曾经分配内存.
该段落是:
C_FindObjects continues a search for token and session objects that
match a template, obtaining additional object handles. hSession is
the session’s handle; phObject points to the location that receives
the list (array) of additional object handles; ulMaxObjectCount is
the maximum number of object handles to be …Run Code Online (Sandbox Code Playgroud) 我尝试使用 python 库“请求”与受智能卡保护的网站进行通信。这意味着 SSL 中的强身份验证:您必须提供客户端证书(证书和私钥)。
由于我使用的是智能卡,因此无法读取作为正常保护的私钥(仅模数)。我可以使用 python 库 PyKCS11 读取智能卡:一旦给出密码,所有证书、公钥和私钥模数。
如何混合请求和 PyKCS11 ?
如何使用智能卡中的客户端证书发出 SSL 请求?
编辑 2017/08/04
在我的 Mac 上:
我现在的问题是 pyOpenSSl 在 API 中没有选择引擎的功能(如 pkcs11)。所以我被阻止了。我不能使用蟒蛇。
我有两个应用程序,一个计算文档的 SHA-256 哈希,另一个计算 RSA 签名。尝试不同的事情我得出的结论是,制作CKM_SHA256然后制作CKM_RSA_PKCS给出的结果与仅仅制作CKM_SHA256_RSA_PKCS文档本身不同。
所以我的问题是,这两种实现有什么区别?什么信息被添加到哈希CKM_SHA256_RSA_PKCS机制中以产生完全不同的签名?