3

Bouncy Castle と .Net フレームワークの組み合わせを使用して X509 証明書を作成する asp.net 4.0 プロジェクトがあります。

私のW7開発マシンでは正しく動作しますが、W2008(r2ではなく32ビット)にインストールすると、次のコードが表示されます:

CX509CertificateRequestPkcs10 csr = new CX509CertificateRequestPkcs10();

この例外をスローします:

タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプ 'CERTENROLLLib.CX509CertificateRequestPkcs10' にキャストできません。この操作は、IID '{728AB35B-217D-11DA-B2A4-000E7BBB2B09}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーのために失敗したため、失敗しました: そのようなインターフェイスはサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE)) .

COM は 32 ビットのみと互換性がありますが、サーバーは 32 ビットであるため、最初は 64 ビット サーバーの問題である可能性があると考えました。

アプリはフレームワーク 4.0 を使用して構築され、割り当てられた IIS AppPool は 4.0 の統合モードで実行され、「ネットワーク サービス」の ID が使用されます。クライアント ブラウザーが使用する (IE8 32) とまったく同じです。

W2008-32 (標準) はそのままで CERTENROLLLib を実装していませんか? この状況で動作させる方法を知っている人はいますか?

ご提案ありがとうございます。

4

1 に答える 1

5

CX509CertificateRequestPkcs10オブジェクトをインスタンス化するときは、使用するインターフェイスを明示的に指定します(ProgIDによって)。Win2008 R2では、Microsoftがインターフェイスを上書きしました。それ以外の:

CX509CertificateRequestPkcs10 objPkcs10 = new CX509CertificateRequestPkcs10();

使用する:

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

Win2008 R2でMicrosoftがインターフェイスを上書きしたため、コードがWin2008 R2で記述されている場合、ランタイムは新しいインターフェイスGUIDを探しますが、通常のWin2008では、Win2008R2インターフェイスGUIDがWin2008インターフェイスGUIDと異なるため見つかりません。

そのため、オブジェクトを作成できず、結果として例外がスローされます。

ProgIDでインターフェースにアクセスすると、問題が解決します。

参照:TechNet Answer -W2008-32では、R2が古い「標準」インターフェイスを上書きしたため、Pkcs10オブジェクトを作成するときにインターフェイスGUIDを指定する必要があります。

于 2012-07-10T21:30:06.787 に答える