接続に証明書が必要な Web サービスに接続するために、サービス ユーザー アカウントを偽装しています。コードを実行しているマシンのサービス アカウントにクライアント証明書をインストールしましたが、System.Security.Cryptography.CryptographicException: The system cannot find the file specified というエラーが表示されます。
using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password"))
{
var clientCert = new X509Certificate2("filePath", "certPassword");
}
偽装コードは機能します。簡潔にするために省略しましたが、Environment.UserName をログに記録して、コンテキストが svcAcctUserName ユーザーに切り替えられていることを確認します。これは、svcAcctUserName として実行していることを示しています。filePath は正しいです。ここでも省略しましたが、X509Certificate2 オブジェクトを作成する前にファイルを開いたり閉じたりして、ファイルへのアクセスとパスが正しいことを確認します。
パスをパラメーターとして提供し、コードを実行しているユーザーがアクセスできることを確実に知っているため、エラーは紛らわしいです。
編集:
これも試してみました: ASP.NET Web アプリケーションでの認証にクライアント証明書を使用して Web サービスを呼び出す方法
私は asp.net アプリケーションを使用していませんが、とにかく試してみました。証明書アドインを mmc に追加し、「ローカル コンピューター」証明書アドインを追加してから、その証明書をローカル マシンの個人用ストアにインポートしました。
次に実行しました:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\My -s issuedToName -a domain\svcAcctUserName
操作を再度実行しようとしましたが、同じ問題が発生しました。
私は何が欠けていますか?