39

X509Certificate2バイト配列のPKCS#12 BLOBからを構築しようとしていますが、かなり不可解なエラーが発生します。このコードは、WindowsXPの管理者権限を持つデスクトップアプリケーションで実行されています。

_LoadCertFromBlobスタックトレースは次のとおりですが、がマークされているため、トラブルシューティングしようとして迷子になりました[MethodImpl(MethodImplOptions.InternalCall)]

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
  at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
  at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
  at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
  at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)

編集: blobは、RSA秘密鍵と証明書(自己署名または最近CAに登録されたもの)を含むC#用にBouncyCastleによって生成された真のPKCS#12です-私がやろうとしているのは、秘密鍵と証明書を変換することですBouncyCastleライブラリからSystem.Security.Cryptographyライブラリに、一方からエクスポートしてもう一方にインポートすることにより。このコードは、試されたシステムの大部分で機能します。そのコンストラクターからスローされた特定のエラーを見たことがありません。それはその1つの箱のある種の環境の奇妙さかもしれません。

編集2:エラーは別の都市の別の環境で発生しており、ローカルで再現できないため、壊れたXPインストールにチョークで書く必要があるかもしれません。

しかし、あなたが尋ねたので、ここに問題の断片があります。このコードは、BouncyCastle表現の秘密鍵と証明書を取得し、同じ識別名の以前の証明書を個人鍵ストアから削除し、新しい秘密鍵と証明書を中間PKCS#12ブロブを介して個人鍵ストアにインポートします。

// open the personal keystore
var msMyStore = new X509Store(StoreName.My);
msMyStore.Open(OpenFlags.MaxAllowed);

// remove any certs previously issued for the same DN
var oldCerts =
    msMyStore.Certificates.Cast<X509Certificate2>()
        .Where(c => X509Name
                        .GetInstance(Asn1Object.FromByteArray(c.SubjectName.RawData))
                        .Equivalent(CurrentCertificate.SubjectDN))
        .ToArray();
if (oldCerts.Length > 0) msMyStore.RemoveRange(new X509Certificate2Collection(oldCerts));

// build a PKCS#12 blob from the private key and certificate
var pkcs12store = new Pkcs12StoreBuilder().Build();
pkcs12store.SetKeyEntry(_Pkcs12KeyName,
                        new AsymmetricKeyEntry(KeyPair.Private),
                        new[] {new X509CertificateEntry(CurrentCertificate)});
var pkcs12data = new MemoryStream();
pkcs12store.Save(pkcs12data, _Pkcs12Password.ToCharArray(), Random);

// and import it.  this constructor call blows up
_MyCertificate2 = new X509Certificate2(pkcs12data.ToArray(),
                                       _Pkcs12Password,
                                       X509KeyStorageFlags.Exportable);
msMyStore.Add(_MyCertificate2);
msMyStore.Close();
4

5 に答える 5

46

PKCS#12またはPFXファイルだけがありますか?Microsoftの世界でも同じですが、他の人は別のことを考えています(このアーカイブページを参照)。

フォローするだけで試すことができます

X509Certificate2 cert = X509Certificate2(byte[] rawData, "password");
X509Certificate2 cert2 = X509Certificate2(byte[] rawData, "password",
              X509KeyStorageFlags.MachineKeySet |
              X509KeyStorageFlags.PersistKeySet |
              X509KeyStorageFlags.Exportable);

X509Certificate2(Byte []))または

X509Certificate2 cert = X509Certificate2("C:\Path\my.pfx", "password");

(フラグを使用する必要がある場合は、Microsoft DocsのX509Certificate2(String、String)およびImport(String、String、X509KeyStorageFlags)を参照してください)

更新:例外スタックトレースだけでなく、コードフラグメントを挿入すると便利です。

どちらX509KeyStorageFlagsを使いますか?Process Monitorを使用して、X509Certificate2コンストラクターを見つけられなかったファイルを見つけることができます。たとえば、問題が発生しているWindowsXPの現在のユーザーのデフォルトのキーコンテナがない可能性があります。作成してインポートを再試行できます。

于 2010-09-29T22:34:47.430 に答える
10

私は同じ問題に遭遇しました。

この古い KB 記事によると、問題は、コンストラクターが証明書を現在のユーザーのプロファイルに読み込もうとすることでしたが、.Net コードがユーザーになりすましていたため、ユーザー プロファイルが読み込まれませんでした。コンストラクターが正しく機能するには、読み込まれたユーザー プロファイルが必要です。

記事から:

X509Certificate2 クラス コンストラクターは、アプリケーションが実行されているユーザー アカウントのユーザー プロファイルに証明書をインポートしようとします。 多くの場合、ASP.NET および COM+ アプリケーションはクライアントを偽装します。その場合、パフォーマンス上の理由から、偽装されたユーザーのユーザー プロファイルは読み込まれません。そのため、偽装されたユーザーの「ユーザー」証明書ストアにアクセスできません。

ユーザー プロファイルを読み込むと、エラーが修正されました。

于 2014-08-15T23:09:53.320 に答える
4

Windows 2012 の Web アプリケーションでこれに遭遇し、アプリケーション プール オプションLoad User Profileを true に設定すると機能しました。

これを行うには、 を実行し、適切なアプリケーション プールに移動して、下を true に変更inetmgr.exeします。Advanced SettingsLoad User ProfileProcess Model

于 2016-03-19T07:37:26.777 に答える
1

私はまったく同じ問題を抱えていました。同じコードとデータ/証明書は、Windows 2003 x86 で特定のユーザーの下で実行すると正常に実行されましたが、別のアカウント (IIS アプリ プールの実行にも使用された) では失敗しました。

どうやら、他の何かが Windows のリソースを使い果たしたため、失敗したユーザーはユーザーのプロファイルを実際に読み込むことができませんでした (彼のデスクトップは奇妙に見えました)。ただし、 Event Viewer には関連するイベントはありませんでした。

再起動すると、一時的に問題が解決しました。これは問題の恒久的な解決策ではありませんが、調査が必要なリソースを消費している何か (COM+ コンポーネント、ネイティブ コード サービスなど) があることを示しています。また、Windows プラットフォームの不安定性も示しています...

于 2011-10-16T15:57:22.210 に答える