2

私の質問をさらに洗練するために、これは3回目の書き直しです。これが一言で言えばシナリオです。

  1. レガシーASP/VBscriptWebサイト
  2. ASPサイトで使用される.NET/C#COMライブラリ
  3. Request.ClientCertificate( "Certificate")を未加工の形式で.NET COMライブラリに送信してデコードし、ActiveDirectoryのクライアント証明書に対してフィールドを検証できるようにします。

    • Request.ClientCertificate( "Certificate")のドキュメントには、ASN.1形式の証明書を表すバイナリデータの文字列であると記載されています。これを受け取る私の.NETメソッドには、パラメーターの文字列型があります。Encoding.UTF8.GetBytesEncoding.Unicode.GetBytes、およびEncoding.ASCII.GetBytesを使用して、 X509Certificate2コンストラクターが期待するbyte[]に変換してみました。

私は、ASP Request.ClientCertificateを未加工の形式で実行する(つまり、デコードする)方法について見つけることができるあらゆる情報をGoogleで検索しようとしましたが、空になりました。また、このデータをファイルに保存し、CertUtilを使用してこれをデコードしようとしましたが、それでもデータのデコードに失敗し、エラーが発生します。

これをいじくり回しながら、ASPとASP.NETから返されるクライアント証明書のサイズを確認することにしましたが、サイズが一致していないことがわかりました。ASPからの証明書は、ASP.NETでは647バイトと1295バイトでした。なぜ両方の環境でサイズが偏っているのかわかりません。したがって、X509Certicate2クラスを使用してASP.NETから返されたクライアント証明書をデコードすることに問題はありません。

また、次のp/invoked関数を使用してみました。

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint CertCreateCertificateContext(uint dwCertEncodingType, 
  byte[] pbCertEncoded, uint cbCertEncoded);

したがって、X509Certificate、X509Certificate2、および上記の関数を使用する場合、一貫した結果が得られます。ASPからの証明書はこれらの関数では使用できません。X509Certificateクラスは、証明書を表すbyte []を使用して構築しようとすると、例外をスローします。

CAPICOMライブラリを使用して証明書をインポートしようとしましたが、X509Certificate2クラスで発生するのとまったく同じ例外が発生します。

要求されたオブジェクトが見つかりません

要約すると、私がやりたいのは、X509Certificateクラスのセットを利用して.NET / C#COMライブラリからASP Request.ClientCertificate( "Certificate")をデコードすることです。

4

3 に答える 3

1

私はついに問題を理解しました、そしてそれは非常に簡単です。ASP側のCAPICOMUtilitiesクラスを使用して、Request.ClientCertificate( "Certificate")をBase64でエンコードする必要がありました。それを行ったら、byte[]へのASCII変換を使用して.NETCOMメソッドを呼び出し、X509Certificate2クラスは証明書のデコードに問題がありませんでした。

于 2011-07-15T16:03:06.330 に答える
1

問題は、作成したCOMインターフェイスを介して送信される証明書データのマーシャリングに関係していると思われます。ASP証明書のサイズ(647)は、.NET証明書のサイズ(1295)のほぼ半分であることに注意してください。ASP側の8ビットバイトの配列を誤って16ビットUnicode文字列に変換していませんか?証明書をデコードするために作成したCOMサーバーのインターフェイス定義を確認すると役立ちます。

于 2011-07-14T19:45:56.513 に答える
0

このページを見ると、証明書を取得してbase64でエンコードされたX509に入れることができるようです。その文字列を.NET側に渡すと、そこからバイト配列を作成し、X509Certificate2コンストラクターを使用して証明書のインスタンスを作成できます。

ASPの証明書クラスのプロパティを使用して必要な情報を抽出し、それを渡すことをお勧めします。

于 2011-07-14T13:47:51.707 に答える