2012-12-20 60 views
3

我試圖使用Syncfusion PDF 10.4進行數字簽名的PDF文檔,像這樣:如何訪問存儲在服務帳戶中的X.509證書?

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(加入證書卡扣安裝合適的證書後,我的本地用戶帳戶的偉大工程在我的用戶帳戶和它存儲在個人),但不是服務(選擇服務帳戶這次,並選擇我的服務)。運行相同的代碼會導致找不到合適的證書,即certificate爲空。此外,PdfCertificate.GetCertificates()會拋出一個AccessViolationException,我認爲這是Syncfusion結束時的一個錯誤。

我可以,但是,重現相同的問題,而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中顯示的所有其他受個人),但如果我調試服務(通過運行它,然後調用System.Diagnostics.Debugger.Launch()),我只會得到一個「CN = LOCAL SERVICE」證書,根本不會顯示在MMC中。

我假設我需要A)告訴它打開正確的證書存儲,或者B)更改服務安裝或運行方式的某些方面,例如爲其提供不同的身份,啓用UserInteraction等。目前,它使用LocalService運行並禁用UserInteraction。

回答

4

The answer appears to be是.NET不支持訪問服務帳戶的證書存儲沒有的P/Invoke或類似:

我不認爲任何.NET的API允許訪問該服務證書存儲。

但是,您可以將證書安裝到運行該服務的帳戶的CurrentUser存儲中。

我已經改變下自己的用戶運行(這並不需要管理員權限)的服務,使用運行方式運行mmc.exe作爲該用戶,並導入證書到用戶的個人存儲。

4

從我記得,Windows機器帳戶(如LocalService)使用機器證書存儲。這意味着在您的代碼中,您必須通過StoreLocation.LocalMachine訪問該商店。

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

請注意,如果你決定運行在特定的身份服務,而應先登錄的身份,然後將證書導入到個人存儲,然後,用StoreLocation.CurrentUser