Flo*_*ian 5 cryptography go elliptic-curve pkcs#11 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),
pkcs11.NewAttribute(pkcs11.CKA_ID, pkcs11KeyID),
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_PUBLIC_KEY),
}
ctx.FindObjectsInit(session, findTemplate);
obj, _, err := ctx.FindObjects(session, 1)
Run Code Online (Sandbox Code Playgroud)
没有错误,只是 hsm 存储中没有密钥。
尽管公钥是证书的一部分,但该对象可能无法单独使用,并且证书也CKO_PUBLIC_KEY
没有属性。CKA_PUBLIC
要获取公钥,您必须检索CKA_VALUE
证书并使用您最喜欢的 X.509v3 证书解析器对其进行解析。毫无疑问,结果将返回编码的公钥值或公钥作为您最喜欢的运行时中的结构。
归档时间: |
|
查看次数: |
1553 次 |
最近记录: |