2017-12-19 30 views
3

私はGOアプリケーションを持っており、ソフトウェアトークンでopencryptoki(pkcs11)を介してその証明書をHSMに保存します。しかし、それは行く質問ではない、私が思うより一般的なpkcs11の質問。テンプレートを使用して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

すでにあなたの質問に書かれているとおり、あなたが唯一の2つの永続トークンオブジェクトインポート/作成している - 証明書オブジェクト(CKA_CLASS = CKO_CERTIFICATE)と秘密鍵オブジェクト(CKA_CLASS = CKO_PRIVATE_KEYを) - ので、当然、あなたはFindObjectsInitを呼び出すことによってのみ、これら2つのオブジェクトを見つけることができますし、 FindObjects

公開鍵オブジェクト(CKA_CLASS = CKO_PUBLIC_KEY)も検索する場合は、最初に作成/インポートする必要があります。

+0

しかし、公開鍵は証明書の一部です、いいえ? – Florian

+1

@Florianはい、ですが、PKCS#11は他の方法で証明書の値を解析または解釈しないで保存します。 – jariq

関連する問題