14.01.2013 | 15:25
Nakon što sam uspješno završio jedan projekt fiskalizacije blagajne za .NET, pokušao sam isto napraviti i za OS X kroz Objective-c.
Koristio sam zvanični WDSL web servisa (koji je usput neupotrebljiv bez popravljanja na sve strane) i kreirao klase putem wsdl2objc programa (
code.google.com/p/wsdl2objc/). Fiskalizacijski web servis ima 3 metode:
1. EchoRequest - isto što i Ping
2. RacunaZahtjev - slanje računa
3. PoslovniProstorZahtjev - slanje podataka o poslovnom prostoru
Prvi web servis sam uspješno spojio i komunikacija je uspostavljena, za druga dva zahtjeva http request treba biti digitalno potpisan i tu za mene počinje prava noćna mora. U .NET-u digitalno potpisivanje je veoma jednostavna stvar, veoma detaljno objašnjeno i to je najmanji problem. U Objective-c ja ne znam otkuda bi uopće počeo. Znam da treba povući certifikat iz KeyChain-a, a kako se dalje koristi blage nemam. Nisam našao neki High level API za to, a nešto što sam našao je jako slabo objašnjeno, radi se o Security Transforms API-u (The security transforms application programming interface (API) is a set of C-based functions in the Security framework, based on Core Foundation). Kako da ja to iskoristim nisam još shvatio. Ako uspješno shvatim krenut ću dalje u prebacivanje .NET aplikacije u Objective-C.
Evo kako se digitalno potpiše zahtjev za račun (XmlDocument) u C# (da mi je naći primjer u Objective-c....):
public static XmlDocument SignXmlDocument(XmlDocument doc, X509Certificate2 cert) {
RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey;
var signedXml = new SignedXml(doc);
signedXml.SigningKey = provider;
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
var reference = new Reference();
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform(false));
reference.AddTransform(new XmlDsigExcC14NTransform(false));
reference.Uri = "#signXmlId";
var keyInfo = new KeyInfo();
var kdata = new KeyInfoX509Data(cert);
var xserial = new X509IssuerSerial();
xserial.IssuerName = cert.IssuerName.ToString();
xserial.SerialNumber = cert.SerialNumber;
kdata.AddIssuerSerial(xserial.IssuerName, xserial.SerialNumber);
keyInfo.AddClause(kdata);
signedXml.KeyInfo = keyInfo;
signedXml.AddReference(reference);
signedXml.ComputeSignature();
var xmlDigitalSignature = signedXml.GetXml();
doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature,true));
return doc;
}