3

次のように、Syncfusion PDF 10.4 を使用して PDF ドキュメントにデジタル署名しようとしています。

PdfLoadedDocument document = new PdfLoadedDocument(inputStream);
PdfCertificate certificate = PdfCertificate.FindBySubject(certificateStoreType, certificateSubjectName);

PdfSignature signature = new PdfSignature(document, document.Pages[0], certificate, "Signatur");
signature.Bounds = new RectangleF(new PointF(5, 5), new SizeF(100, 100));

これは、MMC を使用して適切な証明書をインストールした後 (私のユーザー アカウントに証明書スナップインを追加してPersonalに保存した後)、私のローカル ユーザー アカウントではうまく機能しますが、サービス (今回はサービス アカウントを選択し、私のサービスを選択) では機能しません。 . 同じコードを実行すると、適切な証明書が見つかりません。つまり、null です。さらに、をスローしますが、これは Syncfusion 側のバグだと思います。certificatePdfCertificate.GetCertificates()AccessViolationException

ただし、Syncfusion コードがなくても同じ問題を再現できます。

var store = new System.Security.Cryptography.X509Certificates.X509Store("My");
store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly);
foreach (var item in store.Certificates)
{
    …
}

自分のユーザーとして実行すると、証明書が表示されます (MMC のPersonalの下に表示される他のすべての証明書と同様)。ただし、サービスをデバッグすると (実行してから を呼び出すSystem.Diagnostics.Debugger.Launch())、「CN=LOCAL SERVICE」証明書しか取得できません。これは MMC にはまったく表示されません。

私は、A) 正しい証明書ストアを開くように指示するか、B) サービスのインストールまたは実行方法について何かを変更する必要があると想定しています。たとえば、別の ID を指定したり、UserInteraction を有効にしたりするなどです。現在、それはLocalService を使用し、UserInteraction を無効にして実行します。

4

3 に答える 3

4

私の記憶では、Windows マシン アカウント (LocalService など) はマシン証明書ストアを使用します。これは、コード内で、 を使用してストアにアクセスする必要があることを意味しますStoreLocation.LocalMachine

var store = 
   new System.Security.Cryptography.X509Certificates.X509Store(StoreLocation.LocalMachine);

特定の ID でサービスを実行することにした場合は、最初に ID としてログインし、次に証明書を個人ストアにインポートしてから を使用する必要があることに注意してくださいStoreLocation.CurrentUser

于 2012-12-20T21:34:00.787 に答える
4

答えは、.NET が P/Invoke などを使用せずにサービス アカウント証明書ストアにアクセスすることをサポートしていないことのようです。

サービス証明書ストアへのアクセスを許可する .NET API はないと思います。

ただし、サービスを実行するアカウントの CurrentUser ストアに証明書をインストールできます。

サービスを独自のユーザー (管理者権限は必要ありません) で実行するように変更し、mmc.exerunas を使用してそのユーザーとして実行し、証明書をそのユーザーの個人ストアにインポートしました。

于 2012-12-24T14:44:51.043 に答える