2012-10-09 84 views
1

我正在開發一個PDF簽名工具。爲此,我將獲得PKCS#1格式的PDF格式的簽名sha256數據和來自設備的證書,我需要將這兩個數據嵌入到PDF中。大多數PDF閱讀器僅支持PKCS#7簽名。如果我有證書,我們如何將PKCS#1轉換爲PKCS#7?

是否有任何方法將PKCS#1簽名轉換爲PKCS#7簽名(使用證書文件)?

我知道PKCS#7 =證書+可選的原始數據+簽名在PKCS#1格式

回答

6

你的問題有點過於簡化的情況。

關於PKCS#7 < - > PKCS#1:

是的,一個PKCS#7簽名容器包含分別基本上含有一個PKCS#1式簽名和一些屬性個SignerInfo對象。但是,這種PKCS#1樣式簽名通常不僅僅是簽署文檔數據,而是簽署了所謂「簽名屬性」的結構。其中之一是文檔散列,其他可以是簽名時間,指向簽名者證書的鏈接以及其他信息;這些額外信息在許多使用情況下都是必需的。只有最原始的SignerInfo結構直接簽署文檔數據。因此,一般情況下,如果您只是將某些數據的PKCS#1簽名包裝在PKCS#7容器中,那麼該簽名容器將不被接受。

詳情請參閱RFC 3852

關於集成PDF簽名:

你對你實現將要描述是有些模糊。您似乎認爲要簽名的文檔散列是原始PDF的散列。對於集成的PDF簽名,這是錯誤的:爲了創建一個集成的PDF簽名,您首先通過一些數據擴展PDF,這些數據包含PKCS#7簽名容器(由規範推薦)或PKCS#1簽名的佔位符集成。然後你需要散列這個擴展的PDF,除了佔位符。 (按照目前的PDF規範,你可以散列少於這個數字,但是現在的Adobe Acrobat/Reader不會接受它,不應該被任何嚴肅的驗證者接受)。

詳見ISO 32000-1:2008 as published by Adobe

根據法律規定,你可能還需要考慮到PDF高級電子簽名(的PAdES)由ETSI,比照規定ETSI standard for EU-compliant electronic signatures。這些將成爲ISO 32000-2,也就是PDF 2.0的一部分。

因此,您是否確定您的用例允許您記住那些非常簡單的PKCS#7簽名,並且是爲正確的文檔創建的PKCS#1源簽名?在這種情況下,通過查看RFC 3852可以很容易地完成這些容器。

無論如何,你應該看看Bruno Lowagie(iText Software)發佈的白皮書Digital Signatures for PDF documents

+0

非常感謝。我用iText軟件(JAVA)計算了一切。 (也與摺紙PDF紅寶石庫工作正常) –

+0

我和你一樣在Sajith Amma的位置。我從服務和證書中獲得PKCS#1簽名,但是我需要一個PKCS#7簽名來實際簽署我用空白容器預先簽署的pdf文檔。 你是如何解決你的問題的?我也使用iText(實際上iTextSharp,但這並不重要)。 –

+0

@AxelÖrnSigurðsson是否有任何您需要支持的特殊簽名檔案(例如,某些PAdES變體或PDF-2特定的內容;或者有關PKCS#7/CMS容器結構的某些其他要求)?如果不是,應該很容易使用例如BouncyCastle構造簽名容器。如果不是這樣,你應該自行解決問題,但不要過於樂觀。 – mkl

1

查看RFC 3852> 5.4。消息摘要計算過程

只要沒有簽名屬性,就可以簡單地將PKCS#1轉換爲PKCS#7。如果存在,那麼PKCS#1只會將內容和PKCS#7的散列轉換爲具有簽名屬性所需的構造中間結構和散列結構的簽名屬性。