在 C# 中将 PKCS'11 对象句柄转换为 X509Certificate 对象

Convert PKCS'11 Object handle to X509Certificate Object in C#

如何将 Object_Handle 由 C_FindObject 返回的 ulong 转换为 C# 中的 X509Certificate 对象。这是代码。

ulong[] foundObjectIds = new ulong[10];
foundObjectIds[0] = CK_INVALID_HANDLE;
success = PKCS11CsharpWrapper.C_FindObjects(session, foundObjectIds, Convert.ToUInt64(foundObjectIds.Length), ref foundObjectCount);

现在我必须将 foundObjectIds[0] 转换为 X509Certificate 对象。

我尝试了以下方法,但它对我不起作用。

IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ulong)));
Marshal.StructureToPtr(foundObjectIds[0], ptr, false);
IntPtr[] arr = new IntPtr[2];
Marshal.Copy(ptr, arr, 0, 1);
X509Certificate2 cert= new X509Certificate2((IntPtr)foundObjectIds[0]);

对象句柄无法转换为 X509Certificate2 对象。您需要使用 C_GetAttributeValue 函数读取证书对象的 CKA_VALUE 属性的值。 CKA_VALUE 属性包含 DER 编码证书,可以作为 byte[] 传递到 X509Certificate2 class.

的构造函数中

顺便说一句,如果您使用的是 Pkcs11Interop 库,那您为什么要使用 LowLevelAPI 而不是 HighLevelAPI