2017-12-19 41 views
3

소프트웨어 응용 프로그램에 opencryptoki (pkcs11)를 통해 HSM에 인증서를 저장하는 GO 응용 프로그램이 있습니다. 하지만 그것은 일반적인 질문이 아닙니다. 더 일반적인 질문입니다.템플릿을 통해 PKCS11 PublicKey를 얻는 방법

내가 이렇게 내 인증서와의 PrivateKey를 설정 :이 완벽하게 작동

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_ID, pkcs11KeyID), 
     pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_PUBLIC_KEY), 
    } 
ctx.FindObjectsInit(session, findTemplate); 
obj, _, err := ctx.FindObjects(session, 1) 

오류가 없습니다 예상대로 HSM 저장소에는 키가없는 단지, 나는 또한

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) 

를 통해 인증서를 얻을 수 있습니다하지만 내 공개 키를 얻을 수 없습니다.

+0

인증서를 얻을 수 있으면이를 구문 분석하고 공개 키 (인증서에 포함 된 정보의 일부)를 가져올 수 있습니다. – Egl

답변

2

공용 키는 인증서의 일부이지만 CKO_PUBLIC_KEY 개체는 별도로 사용할 수 없으며 인증서의 경우 CKA_PUBLIC 특성이 없습니다.

공용 키를 얻으려면 인증서를 검색하고 원하는 X.509v3 인증서 파서를 사용하여 파싱해야합니다. 결과는 의심 할 여지없이 인코딩 된 공개 키 값 또는 공개 키를 원하는 런타임의 구조로 반환합니다.

4

이미 귀하의 질문에 쓴, 당신은 단지 두 개의 영속 토큰 객체 수입/만든 - 인증서 개체 (CKA_CLASS = CKO_CERTIFICATE) 및 개인 키 객체 (CKA_CLASS = CKO_PRIVATE_KEY를) - 자연스럽게 당신이 FindObjectsInit를 호출 만이 두 개체를 찾을 수 FindObjects.

공개 키 개체 (CKA_CLASS = CKO_PUBLIC_KEY)를 찾으려면 먼저 만들기/가져 오기가 필요합니다.

+0

하지만 공개 키는 인증서의 일부입니다. 아니요? – Florian

+1

@Florian 예, 그렇습니다. 그러나 PKCS # 11은 다른 방법으로 인증서 값을 구문 분석하거나 해석하지 않고 저장합니다. – jariq