私は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にエクスポートするとき、エクスポートするファイルのタイトルを変更しました。問題への影響を疑いますが、むしろ言及したいと思います。
IISのアプリケーションプールで以下を設定しましたか?
詳細については、このスタックの質問を参照してください: LoadUserProfileをIIS pool? ==?
Importメソッドを使用してX509Certificate2をインポートしようとしたときに暗号化例外が発生した場合、MachineKeySetのEnumオプションを使用すると、IISでuserContextを作成する必要がなくなり、実装が容易になります。
X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase,
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
この質問は検索ランキングが高いため、X509Certificate2に、ASP.netアプリケーション内の比較的配置されたpxfキーファイルへの絶対パス(受け入れられるパス)を提示する方法を提示したいと思います。
string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";
X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
CspParametersにフラグcsdMachineKeyKeyStore IIS=を渡すと、例外をスローする制限をバイパスできます。
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams);
私はここに解決策を設立しました:
相対パスではなく絶対パスを指定する必要があります。
AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"