slovensko-digital / autogram

Nový, krajší a lepší nástroj na podpisovanie.
European Union Public License 1.2
113 stars 20 forks source link

Podpora pre slovensky datacontainer a podpisy vseobecne #2

Closed jsuchal closed 2 years ago

jsuchal commented 3 years ago

Slovensky XADES podla vyjadrenia NASES:

SigningCertificateV2 nie je na ÚPVS podporovaný (pri všetkých úkonoch - overovaní/rozbaľovaní/opätovnom podpisovaní), keďže tento element nie je v špecifikácii XAdES Baseline profile predpísanej vo vykonávajúcom nariadení Komisie EÚ č. 2015/1506. Je to uvedené aj v dokumentácii funkčnosti CEP v kapitole 5.1: https://www.slovensko.sk/_img/CMS4/Dokumentacia_funkcnosti_CEP.pdf

Metodou pokus omyl sa mi podarilo vytvorit rovnaky dokument ako ked ho clovek podpise cez slovensko.sk

        var document = new FileDocument(filePath);
        document.setMimeType(new MimeType("application/vnd.gov.sk.xmldatacontainer+xml", "xml"));

        var commonCertificateVerifier = new CommonCertificateVerifier();

        var parameters = new ASiCWithXAdESSignatureParameters();
        parameters.aSiC().setContainerType(ASiCContainerType.ASiC_E);
        parameters.setSignatureLevel(SignatureLevel.XAdES_BASELINE_B); 
        parameters.setDigestAlgorithm(DigestAlgorithm.SHA256);
        parameters.setSigningCertificate(privateKey.getCertificate());
        parameters.setSigningCertificateDigestMethod(DigestAlgorithm.SHA256);
        parameters.setCertificateChain(privateKey.getCertificateChain());
        parameters.setSignedInfoCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE);
        parameters.setSignedPropertiesCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE);        
        parameters.setEn319132(false);

        var service = new ASiCWithXAdESService(commonCertificateVerifier);

        var dataToSign = service.getDataToSign(document, parameters);        
        var signatureValue = token.sign(dataToSign, DigestAlgorithm.SHA256, privateKey);
        var signedDocument = service.signDocument(document, parameters, signatureValue);

Toto by bolo dobre mat podporovane v API cez nejaky custom flag sk-signing lebo toto nastavovat cez nizkourovnove flags je velmi nachylne na chybu. Vid #1.

Toto je dokument vseobecna agenda:

<GeneralAgenda xmlns="http://schemas.gov.sk/form/App.GeneralAgenda/1.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><subject>predmet</subject><text>text</text></GeneralAgenda>

Toto je k nemu prisluchajuci datacontainer (takto to vyrobi podpisovac na slovensko.sk)

<?xml version="1.0" encoding="utf-8"?><xdc:XMLDataContainer xmlns:xdc="http://data.gov.sk/def/container/xmldatacontainer+xml/1.1"><xdc:XMLData Identifier="http://data.gov.sk/doc/eform/App.GeneralAgenda/1.9" Version="1.9" ContentType="application/xml; charset=UTF-8"><GeneralAgenda xmlns="http://schemas.gov.sk/form/App.GeneralAgenda/1.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><subject>predmet</subject><text>text</text></GeneralAgenda></xdc:XMLData><xdc:UsedSchemasReferenced><xdc:UsedXSDReference TransformAlgorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" DigestMethod="urn:oid:2.16.840.1.101.3.4.2.1" DigestValue="/Ctn0B9D7HKn6URFR8iPUKfyGe4mBYpK+25dc1iYWuE=">http://schemas.gov.sk/form/App.GeneralAgenda/1.9/form.xsd</xdc:UsedXSDReference><xdc:UsedPresentationSchemaReference TransformAlgorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" DigestMethod="urn:oid:2.16.840.1.101.3.4.2.1" DigestValue="Qo1jYX1JWydvM/OL/rnirphk1rM1z41fPRXBEgp/qbg=" ContentType="application/xslt+xml" MediaDestinationTypeDescription="TXT" Language="sk">http://schemas.gov.sk/form/App.GeneralAgenda/1.9/form.xslt</xdc:UsedPresentationSchemaReference></xdc:UsedSchemasReferenced></xdc:XMLDataContainer>

Vsetky transformacie je mozne najst tu https://formulare.slovensko.sk/_layouts/eFLCM/DetailVzoruEFormulara.aspx?vid=App.GeneralAgenda&vh=1&vl=9 (pre vytvorenie datacontainer je potrebna podpisova transformacia + xsd na validaciu - validovat to asi netreba, staci ten hash vyratat).

agenda.asice.zip mnou vytvorena podpisana vseobecna agenda (kvoli githubu doplneny .zip extension)

durasj commented 3 years ago

Jedna vec mi tu akurat chyba - podpisova politika. To IMHO musi byt sucastou templatu sk-signing tak ci onak aj ked to ide manualne bez toho.

jsuchal commented 3 years ago

Hmm, vidíš tam niečo takéto v tom mnou podpísanom dokumente? Resp môžeme explicitne nastaviť niečo, aby sa to správalo vždy takto, aby to nejaký nový default nepokazil časom. Ideálne to niekde strčiť do testov.

durasj commented 3 years ago

@jsuchal NBU zverejnuje podpisove politky. Aktualne myslim vyzaduju urn:oid:1.3.158.36061701.1.2.2 alebo 1.3.158.36061701.1.2.3. Politika definuje pouzitelne algoritmy. Tu politiku by som tam osobne pridal ako volitelny argument s HTTP linkou politky (cacheovatelne) a volitelnym SHA256 hashom politiky. Podpisovatko by si to stiahlo, overilo hash (a zacacheovalo). Toto by mal byt podla mna default pre sk-signing. Pri podpisovani by sme tak dokazali deklarovat, ze je to podpisane schvalenou politikou NBU - je to aj sucastou dokumentu. Neviem ktore vsetky sluzby SR toto kontroluju/mali by kontrolovat. Ale radsej better safe than sorry.

jsuchal commented 3 years ago

@durasj chcel som tym len povedat, ze ziadnu tuto podpisovu politiku som tam pri podpisani cez dsigner ani zep.disig.sk som nenasiel.