Asp.Net CertEnroll CX509CertificateRequestPkcs10异常

Ser*_*exx 3 asp.net exception windows-server-2008 certenroll

我有一个asp.net 4.0项目,结合使用Bouncy Castle和.Net框架来创建X509证书。

它可以在我的W7开发机上正常运行,但是在W2008(32位,而非r2)上安装时,此代码段如下:

CX509CertificateRequestPkcs10 csr = new CX509CertificateRequestPkcs10();
Run Code Online (Sandbox Code Playgroud)

抛出此异常:

无法将类型为“ System .__ ComObject”的COM对象转换为接口类型为“ CERTENROLLLib.CX509CertificateRequestPkcs10”。该操作失败是因为由于以下错误而导致IID为'{728AB35B-217D-11DA-B2A4-000E7BBB2B09}'的接口的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE)) 。

最初,我认为这可能是64位服务器问题,因为COM仅兼容32位,但是服务器是32位。

该应用程序是使用Framework 4.0构建的,分配的IIS AppPool正在运行4.0(集成模式),身份为“网络服务”-完全与我的开发机上使用的客户端浏览器(IE8 32)相同。

W2008-32(标准)是否没有立即实现CERTENROLLLib?有谁知道在这种情况下如何使其运作?

感谢您的任何建议!

Ser*_*exx 5

实例化CX509CertificateRequestPkcs10对象时,请明确指定要使用的接口(通过ProgID)。在Win2008 R2中,Microsoft重写了界面。代替:

CX509CertificateRequestPkcs10 objPkcs10 = new CX509CertificateRequestPkcs10();
Run Code Online (Sandbox Code Playgroud)

使用:

IX509CertificateRequestPkcs10 objPkcs10 = (IX509CertificateRequestPkcs10)Activator.CreateInstance(Type.GetTypeFromProgID("X509Enrollment.CX509CertificateRequestPkcs10"));
Run Code Online (Sandbox Code Playgroud)

由于Microsoft在Win2008 R2中重写了该接口,因此如果代码是在Win2008 R2中编写的,则运行时将在寻找新的接口GUID,而在常规的Win2008中则找不到该接口,因为Win2008 R2接口GUID与Win2008接口Guid不同。

因此,无法创建对象,并因此引发异常。

通过ProgID访问界面可以解决此问题。

请参阅:TechNet答案 -在W2008-32上,创建Pkcs10对象时必须指定接口GUID,因为R2覆盖了旧的“标准”接口。