Невозможно получить закрытый ключ от Luna HSM через X509Store
Мне нужно использовать сертификат RA, хранящийся в SafeNet Luna HSM, чтобы добавить вторую подпись и сертификат RA в CSR в формате CMC, сгенерированные из клиентского приложения. Я стараюсь избегать использования CryptoAPI или CNG, поэтому решил попробовать Pkcs11Interop.Net.
После выполнения команд OpenSSL для обработки сертификата RA в формате .pfx я получил закрытый ключ в формате PKCS8, а затем импортировал сертификат RA и закрытый ключ в HSM.
С помощью
X509CertificateParser
,
X509Certificate
,
AsymmetricKeyParameter
а также
RsaKeyParameter
из BouncyCastle я получил открытый ключ.
IObjectHandle publicKeyHandle = session.CreateObject(publicKeyAttributes);
С участием
sourceData
полученный из запроса CMC, я мог получить дескриптор закрытого ключа, а затем и подпись после успешного установления сеанса. Нет проблем с проверкой подписи.
byte[] sourceData = ConvertUtils.Base64StringToBytes(inputRequestCmc.RawData);
byte[] signature = session.Sign(mechanism, privateKeyHandles[0], sourceData);
session.Verify(mechanism, publicKeyHandle, sourceData, signature, out isValid);
Мой следующий шаг - завершить CSR... но у меня отсутствует загадка: x509Cert не имеет импортированного закрытого ключа.
SignedCms finalCmc = new SignedCms();
finalCmc.Decode(Convert.FromBase64String(inputRequestCmc.RawData));
CmsSigner signer = new CmsSigner();
signer.Certificate = x509cert;
finalCmc.ComputeSignature(signer);
var cosignedCmc = finalCmc.Encode();
Пока я читаю, Как использовать закрытый ключ, который хранится в HSM и защищен паролем пользователя через Pkcs11Interop ИЛИ CNG?, Я понял, что не могу использовать privateKeyHandles для получения закрытого ключа, а затем нашел Pkcs11Interop.X509Store через Как мне преобразовать закрытый ключ, хранящийся в HSM, в SignedXml.SigningKey на C#.
Я все еще не могу получить закрытый ключ в X509Store. Согласно выпуску X509Store №1 , я дважды проверил, что
CKA_LABEL
а также
CKA_ID
имеют одинаковые значения для всех 3 объектов (закрытый ключ, открытый ключ и сертификат). В Pkcs11Admin я увидел все 3 объекта после того, как вошел в свой HSM через меню Token> Login> User login.
Затем я попробовал следующий код с Luna HSM...
var store = new Pkcs11X509Store(LunaHsmManager.LibraryPath, LunaHsmManager.PinProvider);
Pkcs11X509Certificate cert = store.Slots[0].Token.Certificates[0];
Мне удалось получить сертификат и открытый ключ. В
cert.Info.KeyType
значение - RSA, но
cert.HasPrivateKeyObject
по-прежнему показывает ЛОЖЬ и
cert.GetRSAPrivateKey()
возвращает NULL.
Итак, что мне не хватает в моем коде?
Спасибо