Импортируйте закрытый ключ, используя PKCS # 11 - PullRequest
0 голосов
/ 12 декабря 2018

Мы пытаемся импортировать пару ключей RSA с использованием C # и PKCS # 11 в наш HSM.Импорт секретного ключа с использованием:

    var privateKeyAttributes = new List<ObjectAttribute>();
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, ckaId));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SENSITIVE, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_DECRYPT, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN_RECOVER, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_UNWRAP, true));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_MODULUS, privateKeyParams.Modulus));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE_EXPONENT, privateKeyParams.D));
    var privateKeyHandle = session.CreateObject(privateKeyAttributes);

Сбой с кодом ошибки CKR_TEMPLATE_INCONSISTENT.К сожалению, это не говорит о том, что противоречиво.Я пробовал различные другие комбинации атрибутов, и это всегда дает сбой: - (

Как правильно импортировать закрытый ключ через PKCS # 11?


Примечание: импортработает открытый ключ, использующий очень похожий код:

    var publicKeyAttributes = new List<ObjectAttribute>();
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, ckaId));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PUBLIC_KEY));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ENCRYPT, true));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY, true));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY_RECOVER, true));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_WRAP, true));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_MODULUS, publicKeyParams.Modulus));
    publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PUBLIC_EXPONENT, publicKeyParams.Exponent));
    var publicKeyHandle = session.CreateObject(publicKeyAttributes);

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Ответ таков: вы не можете напрямую импортировать закрытый ключ в SafeNet Luna HSM.Вы должны сначала зашифровать (обернуть) закрытый ключ и только после этого передать его в HSM.См. PKCS # 11, чтобы развернуть закрытый ключ для HSM , чтобы узнать, как это сделать.

0 голосов
/ 13 декабря 2018

К сожалению, API PKCS # 11 не предоставляет подробностей о том, какой именно атрибут из предоставленного шаблона вызвал ошибку, но многие библиотеки PKCS # 11 поддерживают какой-то внутренний механизм ведения журнала, который может выявить реальную причину ошибки.Точные шаги, необходимые для включения ведения журнала, должны присутствовать в документации, предоставленной поставщиком библиотеки PKCS # 11.

Я предполагаю, что вы получаете CKR_TEMPLATE_INCONSISTENT, потому что вы устанавливаете CKA_SENSITIVE в true.Закрытый ключ, импортированный в простом виде, уже утратил свою «чувствительность», поскольку подвергался воздействию внешней среды.Я успешно использую следующий шаблон в проекте Pkcs11Interop.X509Store:

var privateKeyAttributes = new List<ObjectAttribute>()
{
    new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY),
    new ObjectAttribute(CKA.CKA_TOKEN, true),
    new ObjectAttribute(CKA.CKA_PRIVATE, true),
    new ObjectAttribute(CKA.CKA_MODIFIABLE, true),
    new ObjectAttribute(CKA.CKA_LABEL, ...),
    new ObjectAttribute(CKA.CKA_ID, ...),
    new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA),
    new ObjectAttribute(CKA.CKA_MODULUS, rsaPrivKeyParams.Modulus.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_PUBLIC_EXPONENT, rsaPrivKeyParams.PublicExponent.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_PRIVATE_EXPONENT, rsaPrivKeyParams.Exponent.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_PRIME_1, rsaPrivKeyParams.P.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_PRIME_2, rsaPrivKeyParams.Q.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_EXPONENT_1, rsaPrivKeyParams.DP.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_EXPONENT_2, rsaPrivKeyParams.DQ.ToByteArrayUnsigned()),
    new ObjectAttribute(CKA.CKA_COEFFICIENT, rsaPrivKeyParams.QInv.ToByteArrayUnsigned())
};
...