标签: pkcs#11

连接到SoftHSM java

码:

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 keystore pkcs#11 softhsm

8
推荐指数
1
解决办法
5958
查看次数

在64位计算机上访问硬件PKCS11令牌

所以这就是我想要做的.我有一个硬件令牌,上面有一些证书,我正在编写一个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位包装器?

java certificate pkcs#11 32bit-64bit

8
推荐指数
1
解决办法
7895
查看次数

如何使用智能卡在Web应用程序(JavaScript)中制作数字签名?

我们编写了一个文档管理系统,并希望使用Web客户端对文档进行数字签名.我们的Java客户端应用程序已经能够应用和检查数字签名,但我们希望甚至可以使用我们的Web客户端进行签名.这是用GWT编写的,因此,当在客户端运行时,它是一个JavaScript应用程序.

我们不想创建Java applet并将其下载到客户端并执行它.我们希望使用浏览器安全设备或浏览器API来签署文档.我们还希望保留完整的文档服务器端,并仅向客户端移动文档哈希.

我们认为这应该可以使用NSSnpapi/npruntime,但我们没有找到任何关于此的信息.(顺便说一句,在IE中也可以使用npruntime吗?我们应该使用ActiveX来实现与IE相同的结果吗?)

你有什么提示吗?

npapi digital-signature pkcs#11

8
推荐指数
2
解决办法
2万
查看次数

如何使用 PKCS11 在 python 中建立 TLS 会话

我正在尝试在我控制的客户端和 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,对应用程序代码透明。虽然,我找不到任何关于如何做的材料。

python ssl openssl pkcs#11

8
推荐指数
1
解决办法
1061
查看次数

升级到Java 7后编译错误:包sun.security.pkcs11不存在

我刚从Java 6升级到Java 7 SDK,现在我的ant build中出现以下错误:

错误:包sun.security.pkcs11不存在
Provider p = new sun.security.pkcs11.SunPKCS11(is);

我正在运行Windows 7 64位.如果我切换回Java 6,我可以正常编译,但这不再是一个选项.我没有太多运气在网上寻找解决方案.有谁知道如何解决这个问题?

java security pkcs#11

7
推荐指数
1
解决办法
1万
查看次数

使用智能卡的SSL客户端身份验证在Java 6中工作,但在Java 7中失败

以下代码使用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)

authentication ssl smartcard pkcs#11 java-7

7
推荐指数
1
解决办法
4642
查看次数

JVM在退出时挂起

我正在开发一个小应用程序,应该使用数字签名和退出来签署文档.签名可以在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)

如果我 …

java jvm pkcs#11 java-8 windows-8

7
推荐指数
1
解决办法
1160
查看次数

PKCS#11中的内存所有权C_FindObjects其中ulMaxObjectCount!= 1

当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)

cryptography pkcs#11

7
推荐指数
1
解决办法
1060
查看次数

如何使用带有 python 的智能卡发出 TLS 请求?

我尝试使用 python 库“请求”与受智能卡保护的网站进行通信。这意味着 SSL 中的强身份验证:您必须提供客户端证书(证书和私钥)。

由于我使用的是智能卡,因此无法读取作为正常保护的私钥(仅模数)。我可以使用 python 库 PyKCS11 读取智能卡:一旦给出密码,所有证书、公钥和私钥模数。

如何混合请求和 PyKCS11 ?
如何使用智能卡中的客户端证书发出 SSL 请求?

编辑 2017/08/04

在我的 Mac 上:

  • 酿造安装openssl
  • 酿造安装opensc
  • 酿造安装engine_pkcs11
  • openssl
    • 引擎动态 -pre SO_PATH:/usr/local/Cellar/engine_pkcs11/0.1.8/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/local/lib/ (我特定的 Pkcs11 库)。dylib
      • 已加载:(pkcs11) pkcs11 引擎
    • s_client -engine pkcs11 -key '(slot):(id)' -keyform engine -cert 'pem.cer' -connect (host):443 -state -debug
      • SSL 握手正常

我现在的问题是 pyOpenSSl 在 API 中没有选择引擎的功能(如 pkcs11)。所以我被阻止了。我不能使用蟒蛇。

python ssl pkcs#11 python-requests

7
推荐指数
1
解决办法
2633
查看次数

PKCS11Interop Hash with SHA256 和 Sign with RSA 分两步

我有两个应用程序,一个计算文档的 SHA-256 哈希,另一个计算 RSA 签名。尝试不同的事情我得出的结论是,制作CKM_SHA256然后制作CKM_RSA_PKCS给出的结果与仅仅制作CKM_SHA256_RSA_PKCS文档本身不同。

所以我的问题是,这两种实现有什么区别?什么信息被添加到哈希CKM_SHA256_RSA_PKCS机制中以产生完全不同的签名?

rsa sha pkcs#11 pkcs11interop

7
推荐指数
1
解决办法
1090
查看次数