サーバー (Win2008) でアップロードが有効になっている BITS の IIS 拡張機能と、クライアント マシン (Win8.1) で Windows サービスとして実行されている C# .NET4 クライアントがあります。
証明書認証なしの BITS アップロードは正常に機能しています。
自己署名ルート証明書を生成し、それを両方のマシンの TrustedCA ストレージに追加し、子クライアントとサーバー証明書を生成し、それらをそれぞれのストレージに追加しました。どちらも、MMC コンソールで有効かつ信頼できるものとして表示されます。
しかし、クライアント証明書認証 (IIS で「クライアント証明書が必要」を設定し、クライアントの BITS ジョブに証明書を追加) を使用しようとすると、クライアント証明書が IIS で受信されないようです。
クライアントに証明書を設定するために使用しているコードは次のとおりです。
var httpOptions = (IBackgroundCopyJobHttpOptions) job2;
httpOptions.SetClientCertificateByName(certificate.certLocation, certificate.certStoreName, certificate.certSubjectName);
証明書の場所は
BG_CERT_STORE_LOCATION.BG_CERT_STORE_LOCATION_LOCAL_MACHINE
クライアント証明書が LocalMachine にインストールされ、サービスが LocalSystem として実行されているためです。
さらに、私が電話した直後に、私はSetClientCertificateByName
それを取り戻そうとします:
string stName, stLocation;
var hash = new IntPtr();
httpOptions.GetClientCertificate(out loc, out stName, hash, out stLocation)
しかし、空の値を返します。
次の方法で証明書の存在を確認しようとしました:
var store = new X509Store(certificate.certStoreName, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, certificate.certSubjectName, true)
証明書は確かにそこにあります。
また、WinHttpCertCfg.exe (エラーはありませんが、何も変更されていません) と FindPrivateKey.exe (「秘密鍵ファイル名を取得できません」と表示されます) を使用して、LocalSystem アカウントに証明書の秘密鍵へのアクセスを許可しようとしました。
私はこれについてのアイデアがありません。どんな洞察も非常に高く評価されます。