Greška pri čitanju certifikata iz datoteke (COM dll + VB Script + IIS)

Mar 13, 2013 at 7:20 PM
Pozdrav i iskreno hvala developeru za trud, no javljam se sa problemom, nažalost...

radim sa FiskalizacijaDev 2.0 COM dll-om u ASP-u (VbScript) koji je uredno registriran na IIS (Windows 2008) i radi.
Verifikacijski/root (samopotpisani) certifikat za Demo CA instaliran, DEMO certifikat (FISKAL 1) spreman u .pfx datoteci.

Nakon inicijalizacije sustava
Set Fiskal = Server.CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
zovem testne naredbe same komponente i statusa CIS-a
'test komponente
Response.Write Fiskal.TestCom("Ping")
'test sustava
Response.Write Fiskal.DohvatiStatusCisServisa()
Uredno radi i prikazuje Ping i green

Problem je u idućoj naredbi, zaštitnom kodu izračuna, koji želim dobiti putem metode
ZastitniKodIzracunCertifikatDatoteka
Znači, ZKI zovem ovako
Zki = Fiskal.ZastitniKodIzracunCertifikatDatoteka(Server.MapPath("demo.pfx"), "moja-lozinka", "00000000000", Now(), "1", "1", "1", "1.00")
Response.Write Zki
No, IIS mi javlja grešku
mscorlib error '80090020'

An internal error occurred.
Provjerio sam sve varijable nekoliko puta - putanju do .pfx, lozinku, oib, timedate. Dozvole za mapu/datoteku su EVERYONE -> Full. Probao sam i na drugom IIS stroju, no javlja istu grešku. Imate li možda kakav savjet za ovu situaciju?
Coordinator
Mar 13, 2013 at 7:24 PM
99% je da se radi o pravima pristupa do certifikata, ja bih prvo to provjerio - pogledaj malo po ostalim discussionsima, mislim da je dkustec svojevremeno napisao neke korisne savjete po tom pitanju
Mar 13, 2013 at 7:41 PM
Nino, hvala na brzom odgovoru. Pročitao sam forum uzduž i poprijeko, među ostalim i upute od dkustec-a, no tamo su upute za pozivanje certifikata iz Store-a, a ja želim iz datoteke.
Permissioni FISKAL 1 demo certifikata (pod MMC -> Certificates (Local Computer) -> Personal -> Certificates) su namješteni na EVERYONE i odgovarajući Application Pool Identity.
Svejedno, kada napravim prema uputama i zovem ovako
Zki = Fiskal.ZastitniKodIzracun("FISKAL 1", "00000000000", Now(), "1", "1", "1", "1.00")
Response.Write Zki
Također mi javlja grešku
Raverus.FiskalizacijaDEV error '80004003'

Value cannot be null.
Zapeo sam, možda je netko imao sličan problem...
Mar 13, 2013 at 8:55 PM
datum i vrijeme su jedan string spoji ih jednim razmakom umjesto sto ih odvajas zarezom
sori na greskama
tipkam s moba
Mar 13, 2013 at 9:10 PM
Bok Amalthea, hvala na odgovoru. Datum/vrijeme nisu odvojeni zarezom, isprobao sam sve kombinacije stringa:
  • 13.03.2013 21:03:30
  • 13.03.2013. 21:03:30
  • 13.3.2013 21:3:30
  • 13.3.2013. 21:3:30
  • Now() tj. 13.3.2013. 21:03:30
I dalje greška...
Mar 13, 2013 at 9:13 PM
Ja si parametre postavim u pojedinačne stringove i onda pozivam ovako i prolazi mi.

zki = o.ZastitniKodIzracunCertifikatDatoteka(putanja_cert, pwd_cert, OIB_certifikat, DatumIzdavanja & " " & VrijemeIzdavanja, brojcana_oznaka, poslovni_prostor, naplatni_uredjaj, Formatiraj_iznos_tocka(UkupniIznos))
Mar 13, 2013 at 9:24 PM
Edited Mar 13, 2013 at 9:26 PM
Izgleda da nije do datuma, upisao sam ručno "13.03.2013 21:20:10" (sa i bez točke iza godine, nisam ziher kako treba ići jer u primjeru iz dokumentacije je bez točke) i javlja istu grešku.

Kada stavim krivu putanju certifikata ili ne upišem OIB, br. računa, poslovnicu ili operatera, javi Value cannot be null.
Kada upišem krivu lozinku od certifikata javi The specified network password is not correct.

Nemam pojma od čega je pak moja greška
mscorlib error '80090020'

An internal error occurred.
Mar 13, 2013 at 9:28 PM
Edited Mar 13, 2013 at 9:28 PM
-zblesirao se editor-
Mar 13, 2013 at 9:28 PM
Edited Mar 13, 2013 at 9:28 PM
-zblesirao se editor-
Mar 13, 2013 at 9:35 PM
Edited Mar 13, 2013 at 9:36 PM
bit će da je di IIS-a

http://support.microsoft.com/kb/318478


This error occurs as a result of cryptography settings that are used to encrypt sensitive data in the IIS metabase. The metabase, a hierarchical collection of information similar to the registry, is used by certain applications to obtain important configuration settings.

When a Web Application that uses CDONTS/CDOSYS is run in-process (low application protection), it can read the metabase because it runs in the context of the local system account. When a Web Application that uses CDONTS/CDOSYS is run out-of-process, it must access a MachineKey to decode the encrypted metabase data. The error can occur if the IIS user account does not have correct permissions on the folder that contains the MachineKey.
Mar 13, 2013 at 9:45 PM
coax wrote:
Izgleda da nije do datuma, upisao sam ručno "13.03.2013 21:20:10" (sa i bez točke iza godine, nisam ziher kako treba ići jer u primjeru iz dokumentacije je bez točke) i javlja istu grešku.

Kada stavim krivu putanju certifikata ili ne upišem OIB, br. računa, poslovnicu ili operatera, javi Value cannot be null.
Kada upišem krivu lozinku od certifikata javi The specified network password is not correct.

Nemam pojma od čega je pak moja greška
mscorlib error '80090020'

An internal error occurred.
A da probaš string s datumom formatirati kao "dd.MM.yyyyTHH:mm:ss" ( 13.03.2013T21:42:02)
Mar 13, 2013 at 10:02 PM
Edited Mar 13, 2013 at 10:03 PM
@Amalthea nije do toga, već sam odradio tu proceduru jer sam par sati Googlao prije javljanja na forum

@Drazen_IB probao i to, istu grešku javi

Probao sam na Win 7 64bit i Win 2008 64bit (u IIS namješteno da koristi 32bit), ista greška, izbrisao Root certifikat FINA-e, ista greška, ponovno usnimio Root CA, isto...

Screenshot MMC konzole sa certifikatima za User/Computer:
Image
Coordinator
Mar 13, 2013 at 10:22 PM
Kada napraviš dvoklik na FISKAL 1 certfikat, da li imaš labelu "You have a private key that corresponds to this certificate." ?
Image
Mar 13, 2013 at 10:34 PM
@dkustec Imam

Image
Coordinator
Mar 13, 2013 at 10:48 PM
Hmm.. zanimljivo..
mscorlib.dll obično throwa takvu grešku kada mu nešto onemogućava pravo pristupa do privatnog ključa, iako mu je cert store dostupan.
Provjeri da li si .pfx exportao sa privatnim ključem i da nisi uključio opciju da traž od usera potvrdu kada engine pokušava doći do privatnog ključa.

Samo u tome može biti problem, jer je izračun ZKI-a prilično trivijalna stvar i jedini catch u njemju je taj dohvat privatnog ključa kojim potpiše generirani niz znakova izračunatih iz ulaznih parametara metode.
Mar 13, 2013 at 11:07 PM
Exportirao sam sa private key (jer sam morao upisati lozinku nakon toga) i u .pfx format. Ne sjećam se opcije gdje me tražilo da traži potvrdu korisnika. Napravljeno je prema PDF uputama FINA-e.

Upravo sam isprobao ovaj certifikat u besplatna-fiskalna.com i uredno je prošao, generirao ZKI i JIR.
Mar 14, 2013 at 2:12 PM
a da nije ovaj OIB s nizom nula problem?
Mar 14, 2013 at 2:29 PM
dkustec je bio na dobrom putu (a Nino je pogodio, iako je, nažalost, problematika drugačija od predloženog rješenja). Problem je u čitanju certifikata, tj. IIS proces (Application Pool Identity) nema privilegiju pristupiti Certicifate Store bez admin ovlasti. Naime, instalirao sam demo verziju AspEncrypt komponente i s njom odlučio pročitati moj .pfx i javio mi je istu grešku. U njihovoj opširnoj dokumentaciji je naveden tek jedan kratki paragraf
The method OpenStoreFromPFX uses an undocumented CryptoAPI function PFXImportCertStore from the library Crypt32.dll. For this method to work, you must call CM.LogonUser impersonating an admin account prior to calling OpenStoreFromPFX. Also, on IIS 5.0 and prior, your virtual directory's Application Protection option must be set to Low. Otherwise you may receive the errors

The system cannot find the file specified.

or

An internal error occurred.
Trenutno se prijavljujem kao admin putem njihove komponente i tek onda pozivam FiskalizacijaDEV.COM da pročita .pfx datoteku, tj. ZastitniKodIzracunCertifikatDatoteka i stvar tako radi!
Sad, kako je to dosta nespretno rješenje, pokušavam otkriti način kako autorizirati AppPool, bilo putem koda ili možda web.configa. Testiram dalje.
Coordinator
Mar 14, 2013 at 2:45 PM
Edited Mar 14, 2013 at 2:48 PM
Postavi LocalService kao identity koji upravlja AppPoolom u kojem se pokreće IIS proces odgovoran za tvoju web aplikaciju.
Također, u FISKAL 1 certifikatu, koji se nalazi u Personal Store od LocalComputera dodaj FULL CONTROL permisson za LOCAL SERVICE, bez obzira što si već stavio Everyone (LOCAL SERVICE nije u Everyone group). Desni klik na FISKAL 1, ALL TASKS > Manage Private Keys..,

EDIT :> ApplicationPoolIdentity po defaultu ne može hendlati sa certifikatima i identity koji upravlja appPoolom treba postaviti na LocalService kada trebaš raditi sa cert-store
Mar 14, 2013 at 2:57 PM
@dkustec certifikat nije instaliran u Personal Store već čitam .pfx datoteku iz mape, tako da nije moguće odrediti privilegije u Personal Store
Mar 14, 2013 at 2:57 PM
Edited Mar 14, 2013 at 2:57 PM
-opet se zblesirao editor-
Coordinator
Mar 14, 2013 at 3:00 PM
Ista stvar - samo dodaj toj mapi IUSR, IIS_IUSRS i LOCAL SERVICE identityima full control i stvar bu šljakala.
Mar 16, 2013 at 3:05 PM
@dkustec nažalost, nemam mogućnost pogoniti kao LocalService (iako sam dodao privilegije za IUSR, IIS_IUSRS/username pa nije radilo), zasad radi sa AspEncrypt komponentom i dodatnom autorizacijom, dok ne otkrijem kako to zaobići. U svakom slučaju, zahvalan sam na pomoći
Nov 22 at 3:01 PM
umjesto Raverus.FiskalizacijaDEV.PopratneFunkcije.Potpisivanje.DohvatiCertifikat(String certifikatDatoteka, String zaporka) treba koristiti

Dim certifikat As New X509Certificates.X509Certificate2(certifikatDatoteka, zaporka, X509Certificates.X509KeyStorageFlags.MachineKeySet)

... IIS ne dozvoljava (ili ne može, nisam siguran) pristup do Personal storea....
Nov 24 at 6:39 PM
Kod mene to radi ovako

zki = o.ZastitniKodIzracunCertifikatDatoteka("c:\xxxx\demo.pfx", "password", Oib, Format(datumVrijemeIzdavanja, "dd.MM.yyyy HH:mm:ss"), BrojcanaOznakaRacuna, OznakaPoslovnogProstora, OznakaNaplatnogUredaja, Replace(Format(UkupanIznos, "#.00"), ",", "."))