web-dev-qa-db-ja.com

文字列からX509Certificate2を作成中に「要求されたオブジェクトが見つかりません」例外

文字列からX509Certificate2を作成しようとしています。例を示しましょう:

string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));

keyBase64Stringには次のようなコンテンツがあります:"MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="

file.PKCS7データベースからダウンロードしたバイト配列です。

X509Certificate2の作成時に次の例外が発生しました:

リクエストされたオブジェクトが見つかりません

そしてスタックトレース:

「要求されたオブジェクトが見つかりません」X509Certificate2例外「要求されたオブジェクトが見つかりません」} System.Security.CryptographyException.ThrowCryptographicException(Int32 hr)at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte [] rawData)at System。 Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte [] rawData、Object password、X509KeyStorageFlags keyStorageFlags)at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData)at WebApp.SoupController.ove_7)) D:\ Projects\WebApp\Controllers\SoupController.cs:line 118

私が間違っていることを言ってください。どんな助けでも大歓迎です!

9
StepUp

_file.PKCS7_がPKCS#7 SignedData blob(X509Certificate2(Collection).Export(X509ContentType.Pkcs7)から生成されるもの)を表す場合、それを開く方法は2つあります。

  • new X509Certificate2(byte[])/new X509Certificate2(string)
    • 単一の証明書コンストラクターは、SignedData Blobの署名証明書を抽出します。これが証明書のコレクションとしてエクスポートされていて、何も署名していない場合、そのような証明書はないため、_Cannot find the original signer._で失敗します(Win 2012r2、他のバージョンでは、別の文字列にマッピングできます)
  • X509Certificate2Collection::Import(byte[])/X509Certificate2Collection::Import(string)
    • コレクションのインポートは、署名証明書を無視して、「追加」の証明書をすべて消費します。

したがって、それが本当にPKCS#7である場合は、おそらくコレクションのインポート(インスタンス)メソッドが必要です。そうでない場合は、変な変数/フィールド/プロパティ名があります。

2
bartonjs

X509Certificate2のコンストラクタは証明書ファイル名を取得することを期待していますが、キーを与えています( X509Certificate2コンストラクタ(String)

KeyBase64Stringは証明書のキーであり、証明書はコードを実行するマシンにインストールされていると想定しています。これを試して:

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, keyBase64String , false);
//var certCollection = store.Certificates.Find(X509FindType.FindByKeyUsage, keyBase64String , false);
//var certCollection = store.Certificates.Find(X509FindType.FindBySubjectKeyIdentifier, keyBase64String , false);
var cert = certCollection[0];

FindByKeyUsage、FindBySubjectKeyIdentifier、または他のタイプの X509FindType Enumeration を試すこともできます

0
Mockingbird