日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文介紹了使用DSS(CMS容器)確保LTV驗(yàn)證的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我正在開發(fā)一個(gè)解決方案,該解決方案允許在遠(yuǎn)程服務(wù)器上使用p12證書進(jìn)行簽名。

首先,我擁有在一臺(tái)服務(wù)器上計(jì)算的文檔摘要,然后將其發(fā)送到另一臺(tái)服務(wù)器上進(jìn)行簽名。

這里是PDF文件,您將找到兩個(gè)PDF版本。"CURRENT_SIGNATURE.pdf"文件是我使用下面的代碼獲得的結(jié)果。而"TARGER_SIGNATUREPDF.pdf"正是我想要的目標(biāo)。正如您所看到的,目標(biāo)文件顯示的證書吊銷列表嵌入到簽名中。另一方面,當(dāng)前表示文檔中包含的證書吊銷列表。此外,目標(biāo)文件只有一個(gè)簽名,沒有添加修訂版本

https://www.grosfichiers.com/i4fmqCz43is

結(jié)果審核:

我現(xiàn)在的目標(biāo)是添加LTV驗(yàn)證,因?yàn)槲抑牢艺谑褂肞adesCMSSignedDataBuilder在服務(wù)器部分簽名

服務(wù)器A上的*

    public class ServerA {
    private static PAdESSignatureParameters signatureParameters;
    private static DSSDocument documentToSign;
    public static ExternalCMSPAdESService service;
    private static final String TSA_URL = "http://dss.nowina.lu/pki-factory/tsa/good-tsa";


    public static void main(String[] args) throws Exception {
        documentToSign = new FileDocument(new File("Doc 2.pdf"));

        signatureParameters = new PAdESSignatureParameters();
        signatureParameters.setSignatureLevel(SignatureLevel.PAdES_BASELINE_B);
        signatureParameters.setLocation("Luxembourg");
        signatureParameters.setReason("DSS testing");
        signatureParameters.setContactInfo("Jira");
        signatureParameters.setGenerateTBSWithoutCertificate(true);
        CommonCertificateVerifier commonCertificateVerifier = new CommonCertificateVerifier();

        commonCertificateVerifier.setCrlSource(new OnlineCRLSource());
        commonCertificateVerifier.setOcspSource(new OnlineOCSPSource());
        commonCertificateVerifier.setCheckRevocationForUntrustedChains(true);
        service = new ExternalCMSPAdESService(commonCertificateVerifier);
        byte[] documentDigest = computeDocumentDigest(documentToSign, signatureParameters);

        // Embedded CAdES is generated by a third party
        byte[] cmsSignedData = ServerB.getSignedCMSignedData(documentDigest);

        service.setCmsSignedData(cmsSignedData);
        DSSDocument finalDoc = service.signDocument(documentToSign, signatureParameters, null);


        PAdESService service = new PAdESService(commonCertificateVerifier);
        TimestampDataLoader timestampDataLoader = new TimestampDataLoader();// uses the specific content-type
        OnlineTSPSource tsa1 = new OnlineTSPSource("http://dss.nowina.lu/pki-factory/tsa/ee-good-tsa");
        tsa1.setDataLoader(timestampDataLoader);
        service.setTspSource(tsa1);
        PAdESSignatureParameters extensionParameters = new PAdESSignatureParameters();
        extensionParameters.setSignatureLevel(SignatureLevel.PAdES_BASELINE_LT);

        DSSDocument extendedDocument = service.extendDocument(finalDoc, extensionParameters);


        save(finalDoc);
        save2(extendedDocument);
    }

    private static void save(DSSDocument signedDocument) {
        try (FileOutputStream fos = new FileOutputStream("DSS.pdf")) {
            Utils.copy(signedDocument.openStream(), fos);
        } catch (Exception e) {
            Alert alert = new Alert(Alert.AlertType.ERROR, "Unable to save file : " + e.getMessage(), ButtonType.CLOSE);
            alert.showAndWait();
            return;
        }
    }
    private static void save2(DSSDocument signedDocument) {
        try (FileOutputStream fos = new FileOutputStream("DSS-2.pdf")) {
            Utils.copy(signedDocument.openStream(), fos);
        } catch (Exception e) {
            Alert alert = new Alert(Alert.AlertType.ERROR, "Unable to save file : " + e.getMessage(), ButtonType.CLOSE);
            alert.showAndWait();
            return;
        }
    }

    public static CertificateVerifier getOfflineCertificateVerifier() {
        CertificateVerifier cv = new CommonCertificateVerifier();
        cv.setDataLoader(new IgnoreDataLoader());
        return cv;
    }

    protected static byte[] computeDocumentDigest(final DSSDocument toSignDocument, final PAdESSignatureParameters parameters) {
        IPdfObjFactory pdfObjFactory = new ServiceLoaderPdfObjFactory();
        final PDFSignatureService pdfSignatureService = pdfObjFactory.newPAdESSignatureService();
        return pdfSignatureService.digest(toSignDocument, parameters);
    }

    private static class ExternalCMSPAdESService extends PAdESService {

        private static final long serialVersionUID = -2003453716888412577L;

        private byte[] cmsSignedData;

        public ExternalCMSPAdESService(CertificateVerifier certificateVerifier) {
            super(certificateVerifier);
        }

        @Override
        protected byte[] generateCMSSignedData(final DSSDocument toSignDocument, final PAdESSignatureParameters parameters,
                                               final SignatureValue signatureValue) {
            if (this.cmsSignedData == null) {
                throw new NullPointerException("A CMS signed data must be provided");
            }
            return this.cmsSignedData;
        }

        public void setCmsSignedData(final byte[] cmsSignedData) {
            this.cmsSignedData = cmsSignedData;
        }

    }
}

并能夠?qū)τ?jì)算出的哈希進(jìn)行簽名:

服務(wù)器B上的*

public class ServerB {

private static PAdESSignatureParameters signatureParameters;
private static DSSDocument documentToSign;
public static ExternalCMSPAdESService service;

/**
 * Computes a CAdES with specific things for PAdES
 */
public static byte[] getSignedCMSignedData(byte[] documentDigest) throws Exception {
    signatureParameters = new PAdESSignatureParameters();
    signatureParameters.setSigningCertificate(getSigningCert());
    signatureParameters.setCertificateChain(getCertificateChain());
    signatureParameters.setSignatureLevel(SignatureLevel.PAdES_BASELINE_B);
    signatureParameters.setLocation("Luxembourg");
    signatureParameters.setReason("DSS testing");
    signatureParameters.setContactInfo("Jira");

    CMSProcessableByteArray content = new CMSProcessableByteArray(documentDigest);

    PadesCMSSignedDataBuilder padesCMSSignedDataBuilder = new PadesCMSSignedDataBuilder(getOfflineCertificateVerifier());
    SignatureAlgorithm signatureAlgorithm = signatureParameters.getSignatureAlgorithm();

    CustomContentSigner customContentSigner = new CustomContentSigner(signatureAlgorithm.getJCEId());
    SignerInfoGeneratorBuilder signerInfoGeneratorBuilder = padesCMSSignedDataBuilder.getSignerInfoGeneratorBuilder(signatureParameters, documentDigest);

    CMSSignedDataGenerator generator = padesCMSSignedDataBuilder.createCMSSignedDataGenerator(signatureParameters, customContentSigner,
            signerInfoGeneratorBuilder, null);

    CMSUtils.generateDetachedCMSSignedData(generator, content);

    SignatureTokenConnection signingToken = new Pkcs12SignatureToken("certificate.p12",
            new KeyStore.PasswordProtection("123456".toCharArray()));
    DSSPrivateKeyEntry privateKey = getKey("certificate.p12","123456");

    SignatureValue signatureValue = signingToken.sign(new ToBeSigned(customContentSigner.getOutputStream().toByteArray()),
            signatureParameters.getDigestAlgorithm(), privateKey);

    customContentSigner = new CustomContentSigner(signatureAlgorithm.getJCEId(), signatureValue.getValue());
    generator = padesCMSSignedDataBuilder.createCMSSignedDataGenerator(signatureParameters, customContentSigner, signerInfoGeneratorBuilder, null);

    CMSSignedData cmsSignedData = CMSUtils.generateDetachedCMSSignedData(generator, content);
    return DSSASN1Utils.getDEREncoded(cmsSignedData);
}

public static CertificateVerifier getOfflineCertificateVerifier() {
    CertificateVerifier cv = new CommonCertificateVerifier();
    cv.setDataLoader(new IgnoreDataLoader());
    return cv;
}

public static List<CertificateToken> getCertificateChain() throws Exception {
    List<CertificateToken> list = new ArrayList<>();
    CertificateToken[] l = getKey("certificate.p12","123456").getCertificateChain();
    for (int i = 0; i < l.length; i++) {
        list.add(l[i]);
    }
    return list;
}

public static CertificateToken getSigningCert() throws Exception {
    return getKey("certificate.p12","123456").getCertificate();
}

public static DSSPrivateKeyEntry getKey(String certificate, String pin) throws Exception {
    try (Pkcs12SignatureToken signatureToken = new Pkcs12SignatureToken("certificate.p12",
            new KeyStore.PasswordProtection("123456".toCharArray()))) {
        List<DSSPrivateKeyEntry> keys = signatureToken.getKeys();
        KSPrivateKeyEntry dssPrivateKeyEntry = (KSPrivateKeyEntry) keys.get(0);
        DSSPrivateKeyEntry entry = signatureToken.getKey(dssPrivateKeyEntry.getAlias(),
                new KeyStore.PasswordProtection("123456".toCharArray()));
        return entry;
    }
}
private static class ExternalCMSPAdESService extends PAdESService {

    private static final long serialVersionUID = -2003453716888412577L;

    private byte[] cmsSignedData;

    public ExternalCMSPAdESService(CertificateVerifier certificateVerifier) {
        super(certificateVerifier);
    }

    @Override
    protected byte[] generateCMSSignedData(final DSSDocument toSignDocument, final PAdESSignatureParameters parameters,
                                           final SignatureValue signatureValue) {
        if (this.cmsSignedData == null) {
            throw new NullPointerException("A CMS signed data must be provided");
        }
        return this.cmsSignedData;
    }

    public void setCmsSignedData(final byte[] cmsSignedData) {
        this.cmsSignedData = cmsSignedData;
    }

}
}

推薦答案

在an answer to another question的備注中,開始了一場討論,您在該討論中指出了此問題并請(qǐng)求幫助。在那次討論中,很明顯,你還不完全知道你想要達(dá)到什么目的。因此,讓我們稍微澄清一下。

LTV驗(yàn)證

您說要將LTV驗(yàn)證添加到您的簽名。讓我們先來看看這意味著什么。

LTVLOngTV的縮寫。它所代表的目標(biāo)是確保簽名在若干年后仍可被驗(yàn)證。

這個(gè)目標(biāo)試圖克服的挑戰(zhàn)是,從長遠(yuǎn)來看,驗(yàn)證者需要的信息將無法在網(wǎng)上獲得,并且使用的算法最終將不再被認(rèn)為是安全的。

方法是檢索所需信息一次,并以可信的方式將其與簽名捆綁在一起,并應(yīng)用數(shù)字時(shí)間戳來證明特定的數(shù)據(jù)、簽名和額外信息集存在并在給定時(shí)間(例如,當(dāng)使用的簽名算法仍被認(rèn)為強(qiáng)大時(shí))。

到目前為止,一切順利。

Adobe早期(在PDF成為ISO標(biāo)準(zhǔn)之前)定義了一種實(shí)現(xiàn)LTV的機(jī)制:他們指定了一個(gè)特定的簽名屬性,用戶應(yīng)該在簽名之前將驗(yàn)證所需的數(shù)據(jù)收集到該屬性中,并且他們建議對(duì)嵌入的簽名容器應(yīng)用時(shí)間戳。

然而,從那時(shí)起,這種機(jī)制被證明過于簡單和靜態(tài)。根據(jù)使用的驗(yàn)證模型,在簽名之前收集的信息不夠好:要檢查給定的證書在簽名時(shí)是否有效,嚴(yán)格地說,需要在簽名時(shí)間之后生成的信息。若要處理算法變?nèi)醯膯栴},可能需要反復(fù)為整個(gè)文檔加時(shí)間戳。

為了處理這個(gè)ETSI(一個(gè)歐洲標(biāo)準(zhǔn)化組織),指定了向文檔添加與驗(yàn)證相關(guān)的信息的替代方法,以及添加覆蓋整個(gè)文檔(而不僅僅是嵌入的簽名容器)的額外時(shí)間戳的方法。這些機(jī)制不會(huì)更改原始簽名容器,但會(huì)將增量更新中的信息添加到原始文檔中。同時(shí),這些機(jī)制已被添加到ISO 32000-2的國際PDF標(biāo)準(zhǔn)中。它們被歸入PADES一詞。

ETSI還定義了如何使用這些新機(jī)制以可互操作的方式增強(qiáng)簽名的標(biāo)準(zhǔn)方案,PADES基線配置文件:

B級(jí)別僅包含配置為特別包括ESS證書ID屬性的基本簽名容器。
T級(jí)別基于B級(jí)別,但另外還需要簽名后時(shí)間戳。此時(shí)間戳可以作為簽名時(shí)間戳應(yīng)用于原始簽名容器,也可以作為文檔的額外增量更新中的文檔時(shí)間戳。
LT級(jí)別基于T級(jí)別,需要在新的增量更新中添加缺少的中間證書和必需的吊銷信息。
LTA級(jí)別基于LT級(jí)別,需要在另一次增量更新中添加另一個(gè)文檔時(shí)間戳。

為了實(shí)現(xiàn)長期驗(yàn)證,可以重復(fù)添加LTLTA,以提供上一個(gè)時(shí)間戳的驗(yàn)證信息,并記錄所使用的算法是在它們?nèi)匀粡?qiáng)大的時(shí)候應(yīng)用的。

Adobe已經(jīng)建立了他們自己的啟用LTV的配置文件,該配置文件假定對(duì)驗(yàn)證數(shù)據(jù)的要求不那么嚴(yán)格(不需要時(shí)間戳),并且不關(guān)心算法會(huì)變得薄弱。他們基本上收集了他們?cè)谖臋n中找到的所有與驗(yàn)證相關(guān)的信息,并按原樣使用它們。(更確切地說,這是Adobe Acrobat的標(biāo)準(zhǔn)設(shè)置的行為。您可以對(duì)Acrobat進(jìn)行不同的配置以更改要求,例如,使某些時(shí)間戳重要。因此,在談?wù)搯⒂肔TV的簽名時(shí),請(qǐng)始終確保您與您的討論伙伴具有相同的設(shè)置…)

使用eSig DSS進(jìn)行擴(kuò)展

如果要在服務(wù)器A上使用eSig DSS擴(kuò)展PDF簽名,只需使用finalDoc

PAdESService service = new PAdESService(certificateVerifier);
service.setTspSource(tspSource);
PAdESSignatureParameters extensionParameters = new PAdESSignatureParameters();
extensionParameters.setSignatureLevel(extensionLevel);

DSSDocument extendedDocument = service.extendDocument(finalDoc, extensionParameters);

在哪里

certificateVerifier是為在線資源初始化的CommonCertificateVerifier
tspSource是為您選擇的時(shí)間戳服務(wù)初始化的OnlineTSPSource
extensionLevel為所需級(jí)別,如SignatureLevel.PAdES_BASELINE_LT

extendedDocument中的結(jié)果應(yīng)包含所需的驗(yàn)證相關(guān)信息。

這篇關(guān)于使用DSS(CMS容器)確保LTV驗(yàn)證的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,

分享到:
標(biāo)簽:CMS DSS LTV 容器 確保 驗(yàn)證
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定