Преобразование Pkcs11X509Certificate в X509Certificate2 для использования в качестве сертификата клиента ssl
Я новичок в этом... У меня есть сертификаты хранения safenet luna hsm. Мне нужно получить сертификат и использовать его в качестве клиентского сертификата в сеансе ssl. Я безуспешно пытаюсь использовать Pkcs11Interop (а также Pkcs11X509Store). Я не могу получить X509Certificate2 с закрытым ключом. вот что у меня есть: с Pkcs11X509Store:
using (var store = new Pkcs11X509Store(@"c:\program files\Safenet\Lunaclient\cryptoki.dll", new ConstPinProvider(ConfigurationManager.AppSettings["pin"])))
{
Pkcs11X509Certificate cert = store.Slots[0].Token.Certificates.FirstOrDefault(p => p.Info.ParsedCertificate.SerialNumber.ToLower() == ConfigurationManager.AppSettings["certsn"].ToLower());
//RSA rsaPrivateKey = cert.GetRSAPrivateKey();
X509Certificate2 x509cert = cert.Info.ParsedCertificate;
// here cert.HasPrivateKeyObject is true but x509cert.HasPrivateKey is false
}
поэтому x509cert не работает как действительный сертификат для ssl...
с Pkcs11Interop:
using (IPkcs11Library pkcs11Library = Settings.Factories.Pkcs11LibraryFactory.LoadPkcs11Library(Settings.Factories, Settings.Pkcs11LibraryPath, Settings.AppType))
{
ISlot slot = Helpers.GetUsableSlot(pkcs11Library);
using (ISession session = slot.OpenSession(SessionType.ReadOnly))
{
session.Login(CKU.CKU_USER, Settings.NormalUserPin);
List<IObjectAttribute> objectAttributes = new List<IObjectAttribute>();
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE));
session.FindObjectsInit(objectAttributes);
X509Certificate2 x509cert = new X509Certificate2();
List<IObjectHandle> foundObjects = session.FindAllObjects(objectAttributes);
string cka_id = "";
foreach (IObjectHandle foundObjectHandle in foundObjects)
{
List<IObjectAttribute> certAttributes = session.GetAttributeValue(foundObjectHandle, new List<CKA>() { CKA.CKA_VALUE, CKA.CKA_ID });
X509Certificate2 x509Cert2 = new X509Certificate2(certAttributes[0].GetValueAsByteArray());
if (x509Cert2.SerialNumber.ToLower() == ConfigurationManager.AppSettings["certsn"].ToLower())
{
cka_id = certAttributes[1].GetValueAsString();
x509cert = x509Cert2;
break;
}
}
objectAttributes.Clear();
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));
foundObjects.Clear();
foundObjects = session.FindAllObjects(objectAttributes);
foreach (IObjectHandle foundObjectHandle in foundObjects)
{
List<IObjectAttribute> keyAttributes = session.GetAttributeValue(foundObjectHandle, new List<CKA>() { CKA.CKA_VALUE, CKA.CKA_ID });
if (cka_id == keyAttributes[1].GetValueAsString())
{
//how to assign private key to x509cert ?
break;
}
}
session.FindObjectsFinal();
Есть ли способ получить X509Certificate2, который можно использовать позже в качестве сертификата клиента ssl?
Заранее благодарю за любую помощь.
/JS
1 ответ
Экземпляры классов, возвращаемыеPkcs11Interop.Store
библиотеку нельзя использовать в соединениях SSL. Это известное ограничение, вызванное ограниченной расширяемостью класса . Если вы хотите использоватьX509Certificate2
объект с SSL-соединениями, вам нужно получить его из стандартного X509Store .