我有一个关于 HSM 会话的问题。
我知道,如果您为要加密/解密的每个文件初始化并最终确定 cryptoki api,则会产生开销。
我的疑问是,
打开和关闭每个文件的单独会话是否有开销,您想要加密/解密。 (C_Initialize/C_Finalize)
在不影响性能的情况下,一个 HSM 最多可以同时有多少个会话?
打开和关闭会话以处理单个文件是最好的方法,还是打开一个会话并处理多个文件然后关闭会话是最好的方法?
谢谢
Android 是否支持 Sun PKCS#11 提供程序?或者它可以以某种方式转移到Android?
谢谢你。
我买了一个 NitroKey HSM,想用 EC 推导出一个秘密。 以前的问题
为此,我想使用这些CKM_ECDH1_DERIVE机制。此 HSM 支持哪个,请参阅:

参考PKCS#11 规范,必须考虑:
CKM_ECDH1_DERIVE必须与功能一起使用Derive(页 188)CKM_ECDH1_DERIVE需要CK_ECDH1_DERIVE_PARAMS带有以下参数的参数(页 222):
DeriveKey需要以下参数:
因此,根据这些信息,我尝试实现一种方法。
但我收到此错误:
Net.Pkcs11Interop.Common.Pkcs11Exception:方法 C_DeriveKey 返回 CKR_TEMPLATE_INCOMPLETE
在Session.DeriveKey。
说明CKR_TEMPLATE_INCOMPLETE(第 64 页):
如果提供的模板中的属性值,连同任何默认属性值和对象创建函数本身贡献给对象的任何属性值,都不足以完全指定要创建的对象,则尝试应该失败并显示错误代码CKR_TEMPLATE_INCOMPLETE。
和这里(第 98 页)
CKR_TEMPLATE_INCOMPLETE:为创建对象指定的模板不完整,缺少一些必要的属性。有关更多信息,请参阅第 10.1 节。
但我使用了必要的属性:
我使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了一个 RSA 公私密钥对。我想导出密钥对。我使用 Findobject API 来获取密钥,该 API 返回一个 ObjectHandle ,而使用 GetAttributeValue API 读取属性时,我无法读取密钥的值。当我将密钥的属性设置为 CKA_EXTRACTABLE 为 true 时,我无法完全生成密钥。
我还需要在 HSM 中导入外部提供的密钥对。
任何帮助都受到高度赞赏。
我有一个 GO 应用程序,它通过软件令牌中的 opencryptoki (pkcs11) 将它的证书存储到 HSM。但这不是一个围棋问题,我认为更像是一个通用的 pkcs11 问题。
我像这样设置我的证书和私钥:
certTemplate := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_CERTIFICATE),
pkcs11.NewAttribute(pkcs11.CKA_CERTIFICATE_TYPE, pkcs11.CKC_X_509),
pkcs11.NewAttribute(pkcs11.CKA_TOKEN, true),
pkcs11.NewAttribute(pkcs11.CKA_VALUE, certBytes),
pkcs11.NewAttribute(pkcs11.CKA_SUBJECT, template.SubjectKeyId),
pkcs11.NewAttribute(pkcs11.CKA_ID, pkcs11KeyID),
}
privateKeyTemplate := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_PRIVATE_KEY),
pkcs11.NewAttribute(pkcs11.CKA_KEY_TYPE, pkcs11.CKK_ECDSA),
pkcs11.NewAttribute(pkcs11.CKA_TOKEN, true),
pkcs11.NewAttribute(pkcs11.CKA_ID, pkcs11KeyID),
pkcs11.NewAttribute(pkcs11.CKA_EC_PARAMS, []byte{0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07}),
pkcs11.NewAttribute(pkcs11.CKA_VALUE, ecdsaPrivKeyD),
}
ctx.CreateObject(session, certTemplate)
ctx.CreateObject(session, privateKeyTemplate)
Run Code Online (Sandbox Code Playgroud)
这完美地工作。我也可以通过以下方式获得证书
findTemplate := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_TOKEN, true),
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_CERTIFICATE),
pkcs11.NewAttribute(pkcs11.CKA_CERTIFICATE_TYPE, pkcs11.CKC_X_509),
}
ctx.FindObjectsInit(session, findTemplate);
objs, b, err := ctx.FindObjects(session, numSlots)
Run Code Online (Sandbox Code Playgroud)
但正如我所料,我无法获得我的公钥
findTemplate := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_TOKEN, true), …Run Code Online (Sandbox Code Playgroud) 与 Gemalto 网络 HSM 斗争了一段时间,是时候寻求一些专家帮助了。我试图从一个已知的公钥和一个存储在 HSM 上的私钥派生出一个 ECDH1 密钥,并不断将 HSM 发送到某种恐慌模式,这需要我在每次调用派生密钥时它再次开始说话之前重置它功能如下。有人有任何指示吗?
static string PKCSLibraryPath = @"C:\Program Files (x86)\SafeNet\Protect Toolkit 5\Protect Toolkit C SDK\bin\hsm\cryptoki.dll";
static Pkcs11 pkc = new Pkcs11(PKCSLibraryPath, AppType.SingleThreaded);
public string HSM_Interaction(int SlotNumber, string KeyLabel, string Pubkey, string GUID)
{
List<Slot> slots = pkc.GetSlotList(SlotsType.WithTokenPresent);
string pass = "1111";
//convert putblic key to byte array
byte[] data = Get_pub_Key(Pubkey);
//convert password to byte array
byte[] password = Encoding.ASCII.GetBytes(pass);
//select correct HSM slot
Slot S = slots[SlotNumber];
using (Session Sesh = …Run Code Online (Sandbox Code Playgroud) 我正在pkcs12使用命令以以下格式创建密钥库:
> openssl pkcs12 -export -in <cert> -inkey <key> -out mycert.p12 -name <name> -caname <caname>
Run Code Online (Sandbox Code Playgroud)
创建后,我会检查创建的密钥库:
> keytool -list -keystore mycert.p12
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
...
Run Code Online (Sandbox Code Playgroud)
它显示了类型JKS。
当我明确指定密钥库的类型时,输出似乎正确:
> keytool -list -keystore mycert.p12 -storetype pkcs12
Enter keystore password:
Keystore type: PKCS12
Keystore provider: SunJSSE
Run Code Online (Sandbox Code Playgroud)
为什么未指定keytool时会错误地显示密钥库的类型storetype?这种行为对我来说似乎不正确,如果工具无法弄清楚,该命令要么失败,要么不显示密钥库类型。
当我尝试解析编码私钥时
示例私钥
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA4if4vmEnNh2Ijlfrhsb02Exh+LXjkYySOiILtj8rg1ZGWFz1vtPe
DiKbbWLo9xcjDp7UQ2gHnhUZno/gFxcokzTYTkexpb/s4mzU4CH0XaS7IV/xRz1Of1+dwC
2MvsclD0NKceyNu0glocGUu6w2MMsWdevr8YqjPABZYwPmANg5wns61FoI5uQi4e6pcNkr
gGnbf1Sh8DChuM22aLksmOW9UapEKovaUxA4DxEd58zJpmg7UN1ZduUrwCVz1tg1BF+EW5
knMd037olDWdgZtEzMxbmSRlqF6t5dcybnp7LQsdPrbXDubY3mjqgCg25xMk4of3mdDc5b
VcRuNSbDmwAAA+AnwUz5J8FM+QAAAAdzc2gtcnNhAAABAQDiJ/i+YSc2HYiOV+uGxvTYTG
H4teORjJI6Igu2PyuDVkZYXPW+094OIpttYuj3FyMOntRDaAeeFRmej+AXFyiTNNhOR7Gl
v+zibNTgIfRdpLshX/FHPU5/X53ALYy+xyUPQ0px7I27SCWhwZS7rDYwyxZ16+vxiqM8AF
ljA+YA2DnCezrUWgjm5CLh7qlw2SuAadt/VKHwMKG4zbZouSyY5b1RqkQqi9pTEDgPER3n
zMmmaDtQ3Vl25SvAJXPW2DUEX4RbmScx3TfuiUNZ2Bm0TMzFuZJGWoXq3l1zJuenstCx0+
ttcO5tjeaOqAKDbnEyTih/eZ0NzltVxG41JsObAAAAAwEAAQAAAQBUyVuONGo49ZWOmBOq
8cg1l11bmwV4OdVQihcN+lzb3mp9EkzngBLOBddziROCH2B7SLyXkNbaQ1rZgWMoBPynQ7
acknBdjbjHormkVdaBjRLDDm8soCVfx38i33DWzV5tfHLahy8TuZayMBsMySF/5YPELfDF
G47bHd5lKr7+LV3T4kvZ1g1UpDgUGlwpVMpu+ybfhMhCOO2w5Vz/Fl7ptYJQnx8rDARgYu
GDf1yKpRCt7Rx4U+lla5HMnoxh4/g5dXDb8vBDfC/QXj+DPY2/Ju5c3zifryfkB2Cvppq2
EULxDO41iwXgzRpmv9hv6adSp2Qqob72XDu7mWdz/u9BAAAAgFDu2TKaU71igLIMd4sheb
wzjsB2ZW8x5CO+N95OKddkC6lkJiBFrAiF98SVs0AFbqDlw46V3xrBqCVL6ByfW4Zro3Qw
C9GRhjfW/koyuJbplf0uiNaa1ApM7nRoRiOcE5kXkLOObxojPuur29rbI1JGozSn6YhxwA
Q3WthgQipmAAAAgQD7RXYeHQ1P0gpdpWfMXspIbkzODWQDH3VkvQHFFl87+QpsFIWGd8zX
jMMo2bELCgr9cnzRffd8UUCzWJy/mfj+PWjsCr9EaojlnDWYEComa5PYkJKKOxmN+rLg7P
F3Xd/KV4XVBP5wqobTU1sxLnhJkVJMCqHOdDzv9mYr75sXqwAAAIEA5mmDj/4mvkNTNZKw
aaD/8sOz7JjD90jqQCchLETVcwJ1sCgPl5qVAa/S99g9QJXuW3TlXbj4jw01s5APpKq6eY
H91+vJcS8ZmzARXMt4jVB3oWsrhFXw5BEaKYjyKx5gYdSGETbcGz1WxQF4i5E/A43ow73n
RftprflPg+CUU9EAAAAkc3VtaXR0aGFrdXJAU3VtaXRzLU1hY0Jvb2stQWlyLmxvY2FsAQ
IDBAUGBw==
-----END OPENSSH PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
x509.ParsePKCS1PrivateKey(block.Bytes)
Run Code Online (Sandbox Code Playgroud)
它会给我错误解释:
case "OPENSSH PRIVATE KEY":
log.Println("Here at OPENSSH Private Key:")
rsa, err := x509.ParsePKCS1PrivateKey(block.Bytes)
log.Println("Rsa and Error:", rsa, err)
if err != nil {
return nil, err
}
rawkey = rsa
Run Code Online (Sandbox Code Playgroud)
钥匙
-----BEGIN OPENSSH PRIVATE KEY-----
key
-----END OPENSSH PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
获取错误:
asn1: …Run Code Online (Sandbox Code Playgroud) We need to run an old web application which using Java 8 Applet (sick), on Firefox 52.4.1 (last version compatible with Java Applet) and Internet Explorer 11.
The applet is based on Java 8 and distributed by an Apache Tomcat server. It is signed and obfuscated (Proguard).
The user connect to the website with SSL mutual authentication from a smartcard (The client needs a PKCS11 module to get the certificate from the smartcard). The SSL mutual authentication is also done …
我已经在几个兔子洞里寻找答案。
我有一个用 AngularJS 编写的 Web 应用程序,它目前需要 IE11 和 Acrobat 插件才能对 PDF 表单进行数字签名。但是,该插件在 IE11 上是垃圾,不支持现代浏览器(我定义为 Firefox、Chrome 和 Edge。我的公司不支持 Safari。)
因为该应用程序是 AngularJS(而不是在 Node 上运行),所以我需要一个 javascript 解决方案来签署 PDF。不仅如此,签名证书还保存在智能卡上,这意味着我需要一个可以通过某种 PKCS#11 接口访问证书的加密库。在 JavaScript 中。客户目前不接受在 Acrobat 中从外部打开表单。
我查看了多个图书馆,但无法找出一个直接的答案:
这些软件包都没有提供足够的信息让我知道是否进一步研究它们。
任何人都可以向我提供进一步的信息或方向吗?
谢谢,杰森