私の質問をさらに洗練するために、これは3回目の書き直しです。これが一言で言えばシナリオです。
- レガシーASP/VBscriptWebサイト
- ASPサイトで使用される.NET/C#COMライブラリ
Request.ClientCertificate( "Certificate")を未加工の形式で.NET COMライブラリに送信してデコードし、ActiveDirectoryのクライアント証明書に対してフィールドを検証できるようにします。
- Request.ClientCertificate( "Certificate")のドキュメントには、ASN.1形式の証明書を表すバイナリデータの文字列であると記載されています。これを受け取る私の.NETメソッドには、パラメーターの文字列型があります。Encoding.UTF8.GetBytes、Encoding.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")をデコードすることです。