2012-07-10 42 views
3

我有一個asp.net 4.0項目,它使用Bouncy Castle和.Net框架的組合來創建X509證書。Asp.Net CertEnroll CX509CertificateRequestPkcs10異常

它正常運行我的W7的開發機器上,而在W2008安裝時(32位,而不是R2)這段代碼:

CX509CertificateRequestPkcs10 csr = new CX509CertificateRequestPkcs10(); 

拋出此異常:

Unable to cast COM object of type 'System.__ComObject' to interface type 'CERTENROLLLib.CX509CertificateRequestPkcs10'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{728AB35B-217D-11DA-B2A4-000E7BBB2B09}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

起初我還以爲它可能是一個64位服務器的問題,因爲COM只有32位兼容,但服務器是32位。

該應用程序是使用Framework 4.0構建的,IIS AppPool分配的是運行4.0,集成模式,身份爲「網絡服務」 - 與我的開發機完全一樣,使用客戶端瀏覽器(IE8 32) 。

W2008-32(標準)是否不實施CERTENROLLLib開箱即用?有沒有人知道如何使它在這種情況下表現?

感謝您的任何建議!

回答

4

當您實例化CX509CertificateRequestPkcs10對象時,明確指定要使用的接口(通過ProgID)。在Win2008 R2中,Microsoft覆蓋了該接口。 相反的:

CX509CertificateRequestPkcs10 objPkcs10 = new CX509CertificateRequestPkcs10(); 

使用:

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

自的Win2008 R2微軟改寫接口,如果代碼被寫入的Win2008 R2運行時間尋找新的接口GUID和定期因爲Win2008 R2界面GUID與Win2008界面Guid不同,所以無法找到Win2008。

因此,無法創建對象,並且導致異常被拋出。

通過ProgID訪問接口解決了這個問題。

請參閱:TechNet Answer - 在W2008-32上創建Pkcs10對象時必須指定接口GUID,因爲R2覆蓋了舊的「標準」接口。

+0

我更新了答案,以包含解決方案。我有同樣的問題,你的解決方案爲我節省了很多時間。謝謝。 – flayn 2014-10-07 12:46:06

+0

從2012R2到2016再次發生了嗎?我的代碼在我的W10 x64開發機器上完美工作,但不在2012R2 x64 Web服務器上工作。現在呢!非常感謝。 – fero 2017-05-02 15:05:45