将PKCS'11对象句柄转换为C#中的X509Certificate对象
问题描述:
如何将由C_FindObject返回的ulong Object_Handle转换为C#中的X509Certificate对象。这是代码。将PKCS'11对象句柄转换为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
函数读取证书对象的属性的值。 属性包含DER编码证书,该证书可以作为byte[]
传递给X509Certificate2
类的构造函数。
顺便说一句如果你正在使用Pkcs11Interop库,那你为什么要用LowLevelAPI
而不是HighLevelAPI
?
我最近遇到了这个PKCS11 interop。在那之前我的原型是基于lowlevel api的。我刚开始用highlevel api替换它们,但在两种情况下它都返回一个IntPtr。我尝试将内容复制到一个byte []并尝试使用它来初始化X509Certifcate。但是我得到错误。 “字节数组不能转换为X509Certificate” –