web-dev-qa-db-ja.com

CryptographicExceptionが処理されませんでした:システムは指定されたファイルを見つけることができません

私はSSL通信の謎を受け入れようとしていますが、 このサイト で素晴らしいチュートリアルを見つけました。自分の証明書をテストしようとしていました。 Visual Studio 2012を使用して、既存のファイル(.pfx形式の証明書)を追加し、app.configの「証明書」と「パスワード」の設定を変更しました。しかし、それを実行しようとすると、エラーが発生しました:

CryptographicExceptionが処理されませんでした:システムは指定されたファイルを見つけることができません

次に、Webサービスで同じことを試しました。そこで、エラーに関するいくつかの詳細を取得しました。

System.Security.Cryptography.CryptographicException: System cannot find specified file.

   at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   v System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   v TestServer.DataService.LoadSoap() v c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TestServer\TestServer\DataService.asmx.cs:line 48

私はこの質問を記事の著者に書きましたが、彼の最後の返信は2012年3月だったので、彼が返信するかどうかはわかりません。誰かがこの問題で私を助けることができれば、私は非常に感謝します。

追伸:証明書を.cerから.pfxにエクスポートするとき、エクスポートするファイルのタイトルを変更しました。問題への影響を疑いますが、むしろ言及したいと思います。

52
Storm

IISのアプリケーションプールで以下を設定しましたか?

  1. IIS Managerに移動
  2. アプリケーションプールインスタンスに移動します
  3. 詳細設定をクリックします
  4. プロセスモデルで、ユーザープロファイルの読み込みをtrueに設定します。

詳細については、このスタックの質問を参照してください: LoadUserProfileをIIS pool? ==?

184
nologo

Importメソッドを使用してX509Certificate2をインポートしようとしたときに暗号化例外が発生した場合、MachineKeySetのEnumオプションを使用すると、IISでuserContextを作成する必要がなくなり、実装が容易になります。

X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase, 
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
7
Salomon Arias

この質問は検索ランキングが高いため、X509Certificate2に、ASP.netアプリケーション内の比較的配置されたpxfキーファイルへの絶対パス(受け入れられるパス)を提示する方法を提示したいと思います。

    string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";

    X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
6
m12lrpv

CspParametersにフラグcsdMachineKeyKeyStore IIS=を渡すと、例外をスローする制限をバイパスできます。

CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams);

私はここに解決策を設立しました:

情報リソースへのリンク

6
Alejandro PC

相対パスではなく絶対パスを指定する必要があります。

AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
2
user2607417