Signed XML standard na MS način

Oct 29, 2012 at 11:42 PM

Nakon višednevnog pokušavanja potpisivanja XML u PHP i Javi i raznim Linux komandama, a prema navedenim standarima nisam uspio dobiti ispravno potpisanu datoteku (Neispravan digitalni potpis), što je još bolje nisam uspio niti provjeriti vračene poruke da li su ispravno potpisane. Gledajući ovaj dio koda (vidi dolje) iz datoteke Potpisivanje.cs došao sam do zaključka da samo ljudi u MS znaju kako izgleda datoteka koja se potpisuje i da vjerovatno nitko drugi neće uspijeti odgonetnuti. Na ovaj način je vjerovatno potpis i provjera potpisa izveden na serveru pa se svi ostali možemo slikati. Ako ima netko rješenje kako vidjeti što se po MSu točno potpisuje, ostalo neće biti teško implementirati u open source alatima. 

-------------------------------- kod od -------------------------------------------------------------------

 xml = new SignedXml(dokument);
                xml.SigningKey = provider;
                xml.SignedInfo.CanonicalizationMethod =                SignedXml.XmlDsigExcC14NTransformUrl;


                KeyInfo keyInfo = new KeyInfo();
                KeyInfoX509Data keyInfoData = new KeyInfoX509Data();
                keyInfoData.AddCertificate(certifikat);
                keyInfoData.AddIssuerSerial(certifikat.Issuer, certifikat.GetSerialNumberString());
                keyInfo.AddClause(keyInfoData);

                xml.KeyInfo = keyInfo;


                Reference reference = new Reference("");
                reference.AddTransform(new XmlDsigEnvelopedSignatureTransform(false));
                reference.AddTransform(new XmlDsigExcC14NTransform(false));
                reference.Uri = "#signXmlId";
                xml.AddReference(reference);
                xml.ComputeSignature();

------------------------------ kod do ------------------------------------------------

Pozdrav.

Coordinator
Oct 30, 2012 at 7:20 AM

Nisam probao nikako drugačije osim iz .NET-a, no, da citiram Tehničku dokumentaciju, to bi trebalo biti moguće:

"

Elektronički potpis poruke realiziran je kao "xml enveloped signature" tj. elektronički potpis sadržan jeunutar XML elementa koji se potpisuje. U svim porukama potpisuje se root element zahtjeva.Sve informacije vezane na elektroničko potpisivanje sadržane su u elementu <Signature> čija strukturaje propisanahttp://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd shemom i definiranisu unutar http://www.w3.org/2000/09/xmldsig# namespacea definiranog kroz W3C preporuku XMLSignature Syntax and Processing (xmldsig-core)

....

<Signature> elementa ima sljedeću strukturu:<SignedInfo> – XML-DSIG blok s informacijama koje se potpisuju<SignatureValue> – vrijednost potpisa<KeyInfo> – certifikat korišten pri potpisivanjuUnutar SignedInfo elementa definirani su podaci o kanonizaciji i metodi potpisivanja. Potpisi sukanonizirani i metoda potpisivanja je uvijek RSA-SHA1 što se vidi kroz elemente<CanonicalizationMethod> i <SignatureMethod> koji imaju fiksan sadržaj:Kanonikalizacijska metoda koja se koristi prilikom potpisa obvezno mora biti Exclusive XMLCanonicalization (xml-exc-c14n )<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>Nakon tih elemenata nalazi se <Reference> element. Element ima pripadajući atribut URI koji se odnosina podatke koji se potpisuju.<Reference URI="#RacunZahtjev">Podaci koji se potpisuju tj. root element zahtjeva ima atribut Id (definiran je u XML shemi zahtjeva)kojeg se onda referencira unutar samog potpisa iz elementa Reference. Preporuka je da vrijednost Id-abude sam naziv root elementa zahtjeva (u ovom primjeru RacunZahtjev).U primjeru je potpisan element tns:RacunZahtjev i ima Id="RacunZahtjev".<tns:RacunZahtjev Id="RacunZahtjev" xmlns:tns="http://www.apis-it.hr/fin/2012/types/f73"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >Unutar elementa <Reference> nalaze se elementi <Transforms>, <DigestMethod> i <DigestValue>.Element <Transforms> sadrži:<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>Element <DigestMethod> ima vrijednost:<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>Element <DigestValue> sadržava vrijednost izračunatu digest algoritmom za referencirani element.Element <SignatureValue> sadrži base64 enkodiranu vrijednost koja predstavlja elektronički potpisunutar <SignedInfo> elementa.

Element <KeyInfo> sadržava podatke o certifikatu pomoću kojeg je potpisan zahtjev. Sam certifikat jeBase64 kodiran u PEM formatu.<X509Data>/<X509Certificate> sadržava Base64 enkodiran certifikat.

"

Ovo sve kaj je navedeno ovdje bi trebalo biti dovoljno za potpis - možda možeš staviti potpisani XML, onaj koj pokušavaš poslati, pa možda netko skuži u čemu je stvar :)

Nadalje, čini se da CIS nije na .NET-u, pretpostavljam da se radi o JAVA + Oracle, možda se čak niti ne vrti na Win platformi (bilo bi zanimljivo čuti konkretne informacije, ako netko zna), tako da mislim da je multiplatformnost svega osigurana.

Oct 30, 2012 at 10:13 AM

Pozdrav,

novi sam i nisam jako potkovan s xml i soap stvarima pa ne znam da li mogu postaviti koje pitanje u vezi pomoći s time?

 

Coordinator
Oct 30, 2012 at 6:56 PM

@zadzic, da, reci samo :)

Oct 31, 2012 at 7:27 AM

Pozdrav,

Radim u vb.2010, te sam radi svog vlastitog testiranja prije nego što pokušam testirati preko cis-testa prošao na svom računalu uz kreiranje na localhostu testnog servisa sve faze slanja Racuna. Da bih mogao pozvati funkciju servisa (.asmx koja prima i vraća xml doc) u kodu programa morao sam dodati web referencu servisa i importirati namespace localhost.

Pokušao sam dodati web referencu https://cistest.apisit.  , hr:8449/FiskalizacijaServiceTestu program medjutim ne mogu joj pristupiti.

Da li imam pogrešan pristup?

 

Coordinator
Oct 31, 2012 at 7:58 AM
Edited Oct 31, 2012 at 7:59 AM

@zadzic, da, pogresan pristup, svakako.. Tim pristupom ces dobiti pogresku 405: Method Not Allowed.

Umjesto dodavanja web servisa, potrebno je konstruirati novi URI,

 

 dim uri as new Uri("https://cistest.apis-it.hr:8449/FiskalizacijaServiceTest")
dim request as HttpWebRequest = HttpWebRequest.Create(uri)
request.ContentType = "text/xml" 
request.Method = "POST"

Najbolje bi ti bilo da u sourcecode projektu vidis metodu "private XmlDocument SendSoapMessage(XmlDocument soapMessage)" iz koje ce ti sve biti jasno...

Coordinator
Oct 31, 2012 at 7:59 AM

@zadzic, trebaš dodati WSDL file u svoj projekt (http://www.porezna-uprava.hr/fiskalizacija/fiskalizacija.asp). No, iskreno, ne znam da li će ti raditi slanje zahtjeva u CIS na taj način - pouzdano znam da to nije radilo u prvim danima nakon objave testnog okruženja, čuo sam najave da će to kasnije biti moguće, ali ne znam (nismo probali) da li sada radi. To je razlog zašto mi, u sklopu ovog projekta, idemo "direktno", i zašto ne koristimo WSDL.

Oct 31, 2012 at 8:15 AM

Hvala na odgovorima,

javim se kad isprobam.