Как получить PKCS11 PublicKey через шаблон

У меня есть приложение GO, в котором сертификат хранится в HSM через opencryptoki (pkcs11) в программном токене. Но это не актуальный вопрос, я думаю, это скорее общий вопрос о 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)

Это прекрасно работает. Я также могу получить сертификат через

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)

Но я не могу получить свой открытый ключ, как я ожидал

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)

Ошибки нет, просто ключей в hsm store нет.


person Florian    schedule 19.12.2017    source источник
comment
Если вы можете получить сертификат, вы можете проанализировать его и получить открытый ключ (это часть информации, включенной в сертификат).   -  person Egl    schedule 19.12.2017


Ответы (2)


Хотя открытый ключ является частью сертификата, объект CKO_PUBLIC_KEY может быть недоступен отдельно, а атрибут CKA_PUBLIC также отсутствует для сертификатов.

Чтобы получить открытый ключ, вам нужно получить CKA_VALUE сертификата и проанализировать его с помощью вашего любимого парсера сертификатов X.509v3. Результат, несомненно, вернет либо закодированное значение открытого ключа, либо открытый ключ в виде структуры в вашей любимой среде выполнения.

person Maarten Bodewes    schedule 20.12.2017

Как вы уже писали в своем вопросе, вы создали / импортировали только два объекта постоянных токенов - объект сертификата (CKA_CLASS = CKO_CERTIFICATE) и объект закрытого ключа (CKA_CLASS = CKO_PRIVATE_KEY), поэтому, естественно, вы можете найти только эти два объекта, вызвав FindObjectsInit и FindObjects.

Если вы хотите найти также объект открытого ключа (CKA_CLASS = CKO_PUBLIC_KEY), вам нужно сначала создать / импортировать его.

person jariq    schedule 19.12.2017
comment
Но открытый ключ - это часть сертификата, не так ли? - person Florian; 20.12.2017
comment
@Florian Да, но PKCS # 11 не анализирует и не интерпретирует значение сертификата каким-либо иным образом, а просто сохраняет его. - person jariq; 20.12.2017