CKR_TEMPLATE_INCOMPLETE X509 证书 C_CreateObject

CKR_TEMPLATE_INCOMPLETE for X509 certificate C_CreateObject

我在创建 X509 证书对象时得到 TEMPLETE_INCOMPLETE。

FILL_ATTR(cert_templ[0], CKA_TOKEN, &_true, sizeof(_true));

FILL_ATTR(cert_templ[1], CKA_VALUE, 内容, contents_len);

FILL_ATTR(cert_templ[2], CKA_CLASS, &clazz, sizeof(clazz));

FILL_ATTR(cert_templ[3], CKA_CERTIFICATE_TYPE, &cert_type, sizeof(cert_type));

FILL_ATTR(cert_templ[4], CKA_PRIVATE, &_false, sizeof(_false));

我在这里错过了什么?

这是在 Pkcs11Admin 应用程序中适用于我的用于创建证书对象的最小属性模板:

var certificateAttributes = new List<ObjectAttribute>()
{
    new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE),
    new ObjectAttribute(CKA.CKA_TOKEN, true),
    new ObjectAttribute(CKA.CKA_PRIVATE, false),
    new ObjectAttribute(CKA.CKA_MODIFIABLE, true),
    new ObjectAttribute(CKA.CKA_LABEL, privKeyAttributes[0].GetValueAsString()),
    new ObjectAttribute(CKA.CKA_CERTIFICATE_TYPE, CKC.CKC_X_509),
    new ObjectAttribute(CKA.CKA_SUBJECT, x509Certificate.SubjectDN.GetDerEncoded()),
    new ObjectAttribute(CKA.CKA_ID, privKeyAttributes[1].GetValueAsByteArray()),
    new ObjectAttribute(CKA.CKA_ISSUER, x509Certificate.IssuerDN.GetDerEncoded()),
    new ObjectAttribute(CKA.CKA_SERIAL_NUMBER, new DerInteger(x509Certificate.SerialNumber).GetDerEncoded()),
    new ObjectAttribute(CKA.CKA_VALUE, x509Certificate.GetEncoded())
};

它是用 C# 编写的,但我相信您能够阅读和理解它。

请注意,您很可能需要解析证书才能获得 CKA_SUBJECTCKA_ISSUERCKA_SERIAL_NUMBER 属性的正确值。

另请注意,CKA_LABELCKA_ID 属性通常设置为与相应私钥对象上设置的值相同的值。这样证书对象就得到 "paired" 和私钥对象。