3

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

它在我的 W7 开发机器上正常运行,但是当安装在 W2008(32 位,而不是 r2)上时,这段代码:

CX509CertificateRequestPkcs10 csr = new CX509CertificateRequestPkcs10();

抛出此异常:

无法将“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?有谁知道如何使它在这种情况下表现?

感谢您的任何建议!

4

1 回答 1

5

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

CX509CertificateRequestPkcs10 objPkcs10 = new CX509CertificateRequestPkcs10();

采用:

IX509CertificateRequestPkcs10 objPkcs10 = (IX509CertificateRequestPkcs10)Activator.CreateInstance(Type.GetTypeFromProgID("X509Enrollment.CX509CertificateRequestPkcs10"));

由于在 Win2008 R2 中微软重写了界面,如果代码是在 Win2008 R2 中编写的,则运行时正在寻找新的界面 GUID,而在常规 Win2008 中则找不到,因为 Win2008 R2 界面 GUID 与 Win2008 界面 GUID 不同。

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

通过 ProgID 访问接口解决了这个问题。

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

于 2012-07-10T21:30:06.787 回答