在 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
?
如何将 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
?