0

接続に証明書が必要な 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

操作を再度実行しようとしましたが、同じ問題が発生しました。

私は何が欠けていますか?

4

1 に答える 1

2

したがって、Alexが指摘したように、Windowsの証明書システムの基盤となるアーキテクチャを理解していません。ただし、上記の手順を実行し、X509Storeを使用するようにコードを変更した後、動作するようになりました。うまくいけば、これは誰かを助けるでしょう:

using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password"))
{
   var store = new X509Store(StoreLocation.LocalMachine);
   store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
   var clientCert = store.Certificates.Find(X509FindType.FindByIssuerName, "IssuerNameHere", false);
   var clientCert2 = new X509Certificate2(clientCert[0]);
}
于 2012-05-31T23:31:19.150 に答える