使用ICertAdmin2 :: RevokeCertificate方法在c#中撤销证书
问题描述:
如何将certadm.dll导入托管项目并使用RevokeCertificate方法?我试图添加它作为参考,但我错误地认为它不是程序集或COM对象。使用ICertAdmin2 :: RevokeCertificate方法在c#中撤销证书
任何想法?
更新:我已经尝试过REGSVR32 C:\ certadm.dll,我得到以下错误: 调用LoadLibrary( “C:\ certadm.dll”)失败 - 指定的程序无法找到。
答
您首先需要使用regsvr32
注册COM服务器,然后才能将其添加为Visual Studio中的参考。
例如,
regsvr32 certadm.dll
答
什么下一步的吊销证书?埃里克史密斯,请帮忙。
我尝试此链接
http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa383251(v=vs.85).aspx
和有例外对这个代码
using (var hProv = Win32.GetCSPHandle("c://tmp//cert", "111111"))
{
var cert = Win32.GetCertFromKey(hProv);
var dateNotAfter = cert.NotAfter;
var dateNotBefore = cert.NotBefore;
var serialNumber = cert.SerialNumber;
var strConfig = "localhost/MY";
var ccertadmin = new CERTADMINLib.CCertAdmin();
ccertadmin.RevokeCertificate(strConfig, serialNumber, CRL_REASON_CA_COMPROMISE, DateTime.Now);
}
错误 - 在最后一个字符串 - RPC服务器不可用。虽然服务RPC工作。
答
我知道这是一个非常古老的问题,但我找不到在c#中使用ICertAdmin2 :: RevokeCertificate的任何示例。我认为这里写实用程序是有用的。
1添加certadmin LIB
2使用此代码
public static void RevokeCert(string connection,string serial)
{
//connection= "192.168.71.128\\My-CA"
//serial = "614870cd000000000014"
const int CRL_REASON_UNSPECIFIED = 0;
CERTADMINLib.CCertAdmin _admin = null;
try
{
_admin = new CCertAdmin();
_admin.RevokeCertificate(connection, serial, CRL_REASON_UNSPECIFIED, DateTime.Now);
}
finally
{
if (_admin != null)
Marshal.FinalReleaseComObject(_admin);
}
}
答
所以文件说,恢复保持的证书,你需要MAXWORD(AKA 0xFFFFFFFF的)通入RevokeCertificate功能。但在C#中,Int32无法保存该值。
问题:如何在没有PInvoke的情况下从C#恢复证书?
答
没关系。我忘了使用unchecked {int i =(int)0xffffffff; }块语法。
您可能想看看您尝试注册的certadm.dll的版本。您可以使用DLL导出查看器(http://www.nirsoft.net/utils/dll_export_viewer.html)来检查必需的COM加载/卸载过程是否存在。 – 2009-08-05 09:58:22