2012-12-03 28 views
2

根據幾篇文章,我發現現在可以使用BouncyCastle來執行CAdES,但幾乎沒有關於該主題的任何文檔。使用BouncyCastle使用JAVA標記CAdES

對於初學者,我想在沒有任何可選簽名屬性的情況下使用基於文件的證書對文件執行CAdES-BES。


針對皮屑:

我有可能會有所幫助,你有你的SignerInformation的東西,你需要擴展它,首先你需要創建一個時間戳的屬性,我假設你已經有了一個TimeStampResponse作爲tspResp

TimeStampToken token = tsresp.getTimeStampToken(); 

Attribute timeStamp = new Attribute(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, new DERSet(ASN1Object.fromByteArray(token.getEncoded()))); 

然後,你需要擴展SignerInformation

AttributeTable unsigned = signerInformation.getUnsignedAttributes(); 
Hashtable<ASN1ObjectIdentifier, Attribute> unsignedAttrHash = null; 
if (unsigned == null) { 
    unsignedAttrHash = new Hashtable<ASN1ObjectIdentifier, Attribute>(); 
} else { 
    unsignedAttrHash = signerInformation.getUnsignedAttributes().toHashtable(); 
} 

unsignedAttrHash.put(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, signatureTimeStamp); 

SignerInformation newsi = SignerInformation.replaceUnsignedAttributes(si, new AttributeTable(
     unsignedAttrHash)); 

我認爲就是這樣。

這裏是我得到的登入證書屬性


Attribute signingCertificateAttribute; 
MessageDigest dig = MessageDigest.getInstance(DigestAlgorithm().getName(), 
    new BouncyCastleProvider()); 

byte[] certHash = dig.digest(SigningCertificate().getEncoded()); 

if (DigestAlgorithm() == DigestAlgorithm.SHA1) { 
    SigningCertificate sc = new SigningCertificate(new ESSCertID(certHash)); 

    signingCertificateAttribute = new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificate, new DERSet(sc)); 

} else { 
    ESSCertIDv2 essCert = new ESSCertIDv2(new AlgorithmIdentifier(DigestAlgorithm().getOid()), certHash); 
    SigningCertificateV2 scv2 = new SigningCertificateV2(new ESSCertIDv2[] { essCert }); 

    signingCertificateAttribute = new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificateV2, new DERSet(scv2)); 
} 

希望它可以幫助

+0

感謝您提供的信息,您是否實施了「簽署證書」(或簽署證書-v2)簽名屬性?我在包含它時遇到了麻煩,您是否有任何特定的代碼? – dande

+0

我在sha1的情況下使用簽名證書,在其他地方使用簽名證書-v2,我將添加一些代碼 – Radius

+0

嗨,只是一個簡短的問題,我無法得到我的頭。你發送給時間戳服務器的數據是什麼。我目前正在發送CMSignedData.getEncoded(),它顯示簽名上有一個時間戳,但它顯示爲無效:( – dande

回答

3

CADES是CMS(又名PKCS7),這是可能的BouncyCastle的做的擴展。 RFC5126包含CAdES簽名所需的所有內容,同樣,我建議在ASN.1上查找信息,因爲大多數部分都以該格式描述。

我目前在尋找與您正在尋找的相同答案,並發現書Beginning Cryptography with Java by David Hook提供了許多您可能需要的詳細信息。

+1

)我們已經開發了一個圍繞BouncyCastle和第三方項目的包裝,以使用CAdES-BES簽署和驗證文檔/ CAdES-T/CAdES-C,它是爲一個客戶構建的,我們不打算將它作爲開源發佈(但無論如何),如果我需要任何幫助,請告知我。 – Radius

+0

@AndresSM:我最大的問題是,如何擴展CMS成爲Cades-T,如果您有任何源代碼片段,這將是一個巨大的幫助! – dande

+0

是的看看問題編輯中的代碼 – Radius