以下代码使用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) 我尝试使用 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机制中以产生完全不同的签名?
嘿,问题不是关于Ncryptoki,但我不知道其他地方要问..所以如果有人可以帮助请帮助我.我试着生成AES密钥,然后是我现在拥有的代码:
CK_MECHANISM keyGenMech = new CK_MECHANISM(CKM.AES_KEY_GEN);
CK_ATTRIBUTE[] template =
{
new CK_ATTRIBUTE(CKA.CLASS, CKO.SECRET_KEY),
new CK_ATTRIBUTE(CKA.TOKEN, CK_BBOOL.TRUE),
new CK_ATTRIBUTE(CKA.SENSITIVE, CK_BBOOL.TRUE),
new CK_ATTRIBUTE(CKA.VALUE_LEN, 32),
new CK_ATTRIBUTE(CKA.KEY_TYPE, CKK.AES),
new CK_ATTRIBUTE(CKA.LABEL, "testAES".getBytes()),
new CK_ATTRIBUTE(CKA.PRIVATE, new CK_BBOOL(bPrivate))
};
CryptokiEx.C_GenerateKey(session, keyGenMech, template, template.length, wrappingKey);
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
C_GenerateKey rv=0x62 - key size range
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一些想法从这里去解决这个问题..
编辑:只是为了信息 - 我有SafeNet HSM和即时通讯使用Java PKCS#11包装,称为jprovSafeNet ProtectToolkit附带.
我想从Delphi(XE)应用程序访问存储在Mozilla产品(Firefox和Thunderbird)中的证书.首先,我想列出它们,接下来能够管理它们(导入,导出,删除)并使用它们(符号)会很好.尽管使用mozilla支持的所有令牌,软件令牌就足够了.
到目前为止,我尝试使用XPCOM与http://d-gecko.svn.sourceforge.net/viewvc/d-gecko/trunk/ delphi绑定.然而,周围没有太多的文档,我有点混淆所有的术语和概念.我能管理的最好的是:
var ns:nsIX509CertDB;
servMgr:nsIServiceManager;
p:Pchar;
begin
GRE_Startup;
NS_GetServiceManager(servmgr);
servMgr.GetServiceByContractID('@mozilla.org/security/x509certdb;1',NS_IX509CERTDB_IID,ns);
ns.FindCertNicknames(nil,1,count,p);
GRE_Shutdown;
end;
Run Code Online (Sandbox Code Playgroud)
使用此代码,我确实获得了certdb对象的实例,并且我可以向它请求证书.但是它似乎是完全空的(来自FindCertNicknames的计数为0)并且它也不会对更改OCSP做出反应(IsOcspOn总是返回true).我想我创建了新的certstore,或者我需要以某种方式激活默认用户配置文件.
我也尝试访问softokn.dll作为PKCS#11库.由于这似乎有某种PKCS#11 API,因此响应不佳.即C_Inititialize上的CKR_BAD_ARGUMENTS.
最后也是非常糟糕的方式是直接访问证书文件,因为它应该是"标准"NSS,但我真的不喜欢这种方式.
要在OpenSSL中签署证书,我X509_sign()通过向请求(as X509_REQ*),签名密钥和摘要提供函数来使用函数.
现在我的签名密钥存储在HSM中,因此我无法提取它来签署证书.不幸的是,PKCS#11没有提供相当于X509_sign().它拥有的是C_Sign() / C_SignUpdate() / C_SignFinal()一系列功能,它们对原始数据进行操作,而不是对证书进行操作.
有人可以帮助我使用示例C/C++代码如何使用PKCS#11签署使用OpenSSL创建的证书吗?
接收CKR_GENERAL_ERROR应用程序尝试打开与 H/W HSM 的连接的时间。
详细的错误是:
50004-Crypto API could not be open.
Caused by: xxx.xxx.xxx.cryptoapi.CryptoApiSysException: Error opening session!!
Caused by: iaik.pkcs.pkcs11.wrapper.PKCS11Exception: CKR_GENERAL_ERROR
at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.C_Initialize(Native Method) ~[pkcs11Wrapper-1.2.18.jar:1.2.18]
at iaik.pkcs.pkcs11.Module.initialize(Module.java:307) ~[pkcs11Wrapper-1.2.18.jar:1.2.18]
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这个错误的原因是什么?该应用程序可与软件 HSM 配合使用。
硬件 HSM 详细信息:
我正在尝试在我的应用程序中使用 pkcs11 来访问智能卡。这是“list-slots”命令的输出 -
root@penguin:~/src/tools$ pkcs11-tool -L
Available slots:
Slot 0 (0xffffffffffffffff): Virtual hotplug slot
(empty)
Run Code Online (Sandbox Code Playgroud)
我有 2 个问题
我如何模拟一张假卡,以便插槽 0 中有一个我可以访问的令牌/设备。
我可以创建额外的插槽并向其中添加令牌/设备吗?
如果没有,我该怎么做才能将令牌/设备添加到可用的插槽 0 中?
我目前的提供商有:
0 - 提供商名称:SUN 1 - 提供商名称:SunRsaSign 2 - 提供商名称:SunEC
...
9 - 提供商名称:SunPKCS11-CartaoCidadao
第九个提供程序是我尝试使用的提供程序,它使用 pkcs11 库。
Provider prov = Security.getProvider("SunPKCS11-CartaoCidadao");
keyStore = KeyStore.getInstance("PKCS11", prov );
Run Code Online (Sandbox Code Playgroud)
使用 info 方法我可以看到它正在使用该库:
System.out.println(prov.getInfo());
Run Code Online (Sandbox Code Playgroud)
SunPKCS11-CartaoCidadao 使用库 /usr/local/lib/libpteidpkcs11.so
然而,当我尝试获取密钥实例时,它告诉我该提供程序没有 PKCS11,而它应该是这样。
KeyStore ks = KeyStore.getInstance("PKCS11","SunPKCS11-CartaoCidadao");
keyStore.load( null, null );
Run Code Online (Sandbox Code Playgroud)
java.security.KeyStoreException:未找到 PKCS11
引起原因:java.security.NoSuchAlgorithmException:没有这样的算法:提供商 SunPKCS11-CartaoCidadao 的 PKCS11
有人知道如何解决这个问题吗?
干杯。这是我关于加密堆栈交换的问题的副本。
我正在通过PKCS#11 C/Python 接口处理HSM。我想知道是否可以在硬件中做一些/ 。通过说“在硬件中”,我的意思是加密/解密而不将结果暴露给调用者空间。这主要是关于解密,因为我想调用并将结果作为任意数据保留在 HSM 中,以便稍后对该数据进行一些其他转换,并说在其他一些密钥上重新加密它。先感谢您。C_EncryptC_DecryptC_Decrypt