GithubHelp home page GithubHelp logo

slovensko-digital / autogram Goto Github PK

View Code? Open in Web Editor NEW
90.0 3.0 19.0 7.39 MB

Nový, krajší a lepší nástroj na podpisovanie.

License: European Union Public License 1.2

Java 76.09% CSS 3.03% HTML 16.88% Shell 1.18% XSLT 2.83%

autogram's Introduction

Autogram

Autogram je multi-platformová (Windows, MacOS, Linux) desktopová JavaFX aplikácia, ktorá slúži na podpisovanie a overovanie dokumentov v súlade s európskym nariadením eIDAS. Používateľ ňou môže podpisovať súbory priamo alebo je možné aplikáciu jednoducho zaintegrovať do vlastného (webového) informačného systému pomocou HTTP API. Podpisovanie je možné spúšať aj z príkazového riadku, čo je vhodné pre hromadné podpisovanie veľkého množstva súborov naraz.

Inštalačné balíky pre Windows, MacOS a Linux sú dostupné v časti Releases. Na použitie na existujúcich štátnych weboch bude potrebné doinštalovať aj rozšírenie do prehliadača.

Screenshot

Integrácia

Swagger dokumentácia pre HTTP API je dostupná na githube alebo po spustení aplikácie je tiež dostupná na http://localhost:37200/docs.

Vyvolať spustenie programu je možné priamo z webového prehliadača otvorením adresy so špeciálnym protokolom autogram://. Napríklad cez autogram://go.

Konzolový mód

Autogram je možné spúšťať aj z príkazového riadku (CLI mód). Detailné informácie o prepínačoch sú popísané v nápovede po spustení autogram --help, resp. autogram-cli --help na Windows.

Štýlovanie

Aplikácia momentálne podporuje len jeden štýl - štátny IDSK dizajn. Ďalšie štýly sú plánované. Štýlovanie sa však už teraz deje výhradne cez kaskádové štýly, viď idsk.css

Texty a preklady

Momentálne sú texty v kóde "natvrdo", je plánovaná možnosť ich meniť cez properties súbory. Toto bude slúžiť aj ako zdroj pre preklady.

Podporované karty

Momentálne podporujeme na Slovensku bežne používané karty a ich ovládače:

  • občiansky preukaz (eID klient)
  • I.CA SecureStore
  • MONET+ ProID+Q
  • Gemalto IDPrime 940

Doplniť ďalšie je pomerne ľahké pokiaľ používajú PKCS#11.

Vývoj

Predpoklady

  • JDK 17 s JavaFX (viď nižšie)
  • Maven
  • Voliteľné: Visual Studio Code ako IDE alebo Intellij IDEA (stačí komunitná verzia).

Odporúčame používať Liberica JDK, ktoré má v sebe JavaFX, všetko je potom jednoduchšie. Po zavolaní ./mvnw initialize by sa malo stiahnuť do target/jdkCache.

Build

Spustenie ./mvnw package pripraví všetko do ./target:

  • dependency-jars/
  • preparedJDK/ - JLink JDK (JRE) pripravené pre bundling s aplikáciou.
  • autogram-*.jar - JAR s aplikáciou

Následne pomocou jpackage vytvorí všetky spustiteľné balíčky (.msi/.exe, .dmg/.pkg, a .rpm/.deb).

./mvnw versions:set -DnewVersion=$(git describe --tags --abbrev=0 | sed -r 's/^v//g')
./mvnw package

Debian/Ubuntu

sudo apt install openjdk-17-jdk maven binutils rpm fakeroot

Fedora

sudo dnf install java-17-openjdk maven rpm-build

Autori a sponzori

Jakub Ďuraš, Slovensko.Digital, CRYSTAL CONSULTING, s.r.o, Solver IT s.r.o. a ďalší spoluautori.

Licencia

Tento softvér je licencovaný pod licenciou EUPL v1.2, pôvodne vychádza z Octosign White Label projektu od Jakuba Ďuraša, ktorý je licencovaný pod MIT licenciou, a so súhlasom autora je táto verzia distribuovaná pod licenciou EUPL v1.2.

V skratke to znamená, že tento softvér môžete voľne používať komerčne aj nekomerčne, môžete vytvárať vlastné verzie a to všetko za predpokladu, že prípadné vlastné zmeny a rozšírenia tiež zverejníte pod rovnakou licenciou a zachováte originálny copyright pôvodných autorov. Softvér sa poskytuje "ber ako je", bez záväzkov.

Tento projekt je postavený výhradne na open-source softvéri, ktorý umožnuje jeho používanie tiež komerčne, aj nekomerčne.

Konkrétne využívame najmä GPLv2+Classpath Exception license a EU Digital Signature Service pod licenciou LGPL-2.1.

autogram's People

Contributors

1azyman avatar alhafoudh avatar andrewshadura avatar bombino1024 avatar celuchmarek avatar conder000 avatar dependabot[bot] avatar durasj avatar georgiygit avatar jojurko avatar jsuchal avatar luciajanikova avatar michal-rohacek avatar pavolzbell avatar petersirka avatar plistiak avatar pomali avatar sabomichal avatar xseman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

autogram's Issues

Distribucia updatov

Ako budeme riesit updaty a ich distribuciu klientom?

Jedna moznost je autoupdater, druha je, ze to nechame na konzumentov, ktori vratia pouzivatelovi hlasku, ze ma staru verziu a ma si nainstalovat update.

Industry standard je vsak autoupdate, ktory po spusteni upozorni klienta, ze je nova verzia a jednym kliknutim updatne. Neviem nakolko je toto tazke spravit. Pozname nejake jednoduche riesenie?

API specifikacia

Tu diskutujeme ako bude fungovat API:

Zatial je zhoda, ze to bude fungovat nejako takto:

  • zistime, ze pouzivatel nema nainstalovany podpisovac resp, zlej/starej verzie. (ako?)
  • pouzivatel si nainstaluje aplikaciu, ktora mu zaregistruje custom app protocol.
  • pouzivatel na nejakom portali klikne na linku "podpisat", spusti sa mu cez custom app protokol aplikacia, JS to zisti (asi cez nejake "version API" a nasledne na "sign" API posle naformatovany http request, ze chce podpisat nejaky subor.
  • podpisovac zobrazi vizualizaciu vyzve pouzivatela na BOK (ak treba), ZEP PIN a nasledne zasle ako odpoved JSON? podpisany subor (base64) alebo chybovu hlasku (nepodpisane, alebo cokolvek co moze nastat)

Pre slovenske xml, potrebujeme na vstup poslat: XML subor, XSLT podpisovu transformaciu, XSD schemu validacie. Toto sa musi (!) poslat na podpisovac, aby niekto nepodvrhol inu transformaciu. Z tohto sa vyrobi v podpisovaci slovensky "datacontainer", ktory sa podpisuje.

Otvorene otazky postrehy, ktore maju dosah na architekturu/api:

  • aky format bude na vstupe a vystupe? JSON ci plain old multipart HTTP?
  • co ak chcem podpisat viac dokumentov naraz? Scenar: Poklikam si "do tabov" viac dokumetov na podpisanie.
  • slovensky standard vyzaduje dost specificke nastavenie DSS, je ziaduce, aby API malo okrem nizkourovnovich flagov aj nejaky "template" flag, sk-signing, ktory by nastavil vsetko ako treba, pripadne ked sa situacia v buducnosti zmeni nemusel to konzument podpisovaca sledovat. Jednoducho bude pouzivat sk-signing template vo svojej aplikacii.
  • aplikacia sa otvara na nahodnom porte navrhnutom konzumentom?
  • je vhodne pre nejake scenare (podpisuje viac dokumentov naraz) nechat bezat aplikaciu chvilu na pozadi, aby si pri kazdom podpisovani nepytala BOK na pristup k certifikatom.

Bolo by dobre vytvorit nejake swagger API, ked si povieme ake endpointy ako budu fungovat. Voci nim sa potom daju robit mocks na extensions aj na portali.

Podpora pre nove eid

Vážení integrační partneri,

tento oznam sa Vás týka iba v prípade, ak prevádzkujete portál, ktorý má implementovanú podpisovaciu aplikáciu D.Signer/XAdES.
Na technickú podporu sa obracajú používatelia portálov/aplikácie s chybou: Core.Sign 5: CryptSignHash - Unable to sign the data. The supplied PIN is incorrect.
Problém je v tom, že občianske preukazy s čipom (eID) vydávané od 1.12.2022 na platforme Cosmo 9.2 možno použiť iba v spojitosti s podpisovou schémou RSA PKCS#1 V1.5 SHA-256 (1.2.840.113549.1.1.11).
Podľa vyjadrenia od dodávateľa je teda potrebné v metóde Sign nastaviť parameter digestAlgUri na http://www.w3.org/2001/04/xmlenc#sha256, vzhľadom na to, že nové eID iný algoritmus nepodporujú.

S pozdravom,

Treba skusit u nas.

Podpora pre OpenSC

Aktualna verzia (master) podporuje eid z roku 2021+ (nie vsak nove s NFC). Avsak OpenSC sa sprava s DSS nejako inak. Zjavne ignoruje poziadavky na login pre requesty ktore login nepotrebuju. Avsak potom ide operacia sign a tam uz to hodi, ze klient nie je autentifikovany. Toto spravanie viem zreplikovat aj na inej karte, ktora ma kluc chraneny PINom.

OpenSC ma PR na eidv4 (nove s NFC), OpenSC/OpenSC#2745

Takto by bolo mozne uplne objist proprietarny eid klient (na podpisovanie, nie na autentifikaciu / prihlasovanie)

Otvorene veci:

  • DSS kniznica sa zda, ze s tymto vobec nerata, proste ma jeden handler na errory a vola ho nejako halabala. U nas je natvrdo v kode povedane, ze tento driver vyzaduje PIN a tento nie. Toto mozno treba zmenit.
  • stare eid 2021- OpenSC nepodporuje, mozno keby sme velmi pekne zazmurkali na @jurajsarinay, tak pomoze.
  • nove eid (nfc) - OpenSC zatial nepodporuje, PR otvorene, otestovat sa da.
  • karty maju rozne sloty, DSS by default otvori slot 0, kde su ine certifikaty - tu bude treba asi zmenit logiku podpisovania a preskenovat sloty (ci ich je tam viac) a az potom vytvarat DSS token. Toto vsak moze dost spomalit funkcnost kedze sa bude skenovat cela karta vzdy a potom vytvarat novy provider pre uz konkretny kluc/slot (takto to v DSS funguje, neviem ci mame pristup k internym volaniam). Koncept slotov je pre bezneho pouzivatela asi nepochopitelny, takze to vidim na nejaky magic switchovania slotov podla toho co opensc provider vrati a ked detekujeme viac slotov tak pri eid rovno ideme na "Podpisovy PIN". pkcs15-tool -D vie nejako vytiahnut info k certom bez loginu, asi treba pozriet ako to robi.

Na skusanie treba lokalne buildovat OpenSC z main/branch - ale je to pomerne priamociare (na linuxe)

Logo autogram

Je tu dizajnerska uloha - potrebujeme logo pre autogram. Nejake koncept navrhy su tu:

prvy napad od @jsuchal

image

(Predstavuje tu ciaru dole na ktoru sa bezne podpisuju ludia)

od @pomali
image

Podpora pre podpisovanie lubovolneho dokumentu/prilohy

Hocijaky iny dokument ako (slovenske xml, pdf) by tom malo vediet podpisat formou asice containera.

Tuto je vyzva vizualizacia, neviem uplne co s tym, ale scenar tu je, ze tieto subory tam clovek asi uploaduje sam, cize by mal vediet co to je. Avsak je tu moznost, ze mu portal nieco podvrhne, cize nejaku vizualizaciu podla mna treba od pouzivatela dokonca vynutit. Co je UX pain.

Podpisovanie failne na CKR_PIN_INCORRECT

(toto moze byt problematicke iba pre mna)

info:

  • mam stary cert
  • pin som zadal spravny
  • potrebujem to kvoli testovaniu

postup

  • spustim podpisovanie cez slovensko.sk a extension
  • vsetko je ok az kym nezadam PIN
  • po zadani PIN-u padne appka (je to otrava) s nizsie uvedenym logom
  • je mozne, ze to je exspirovanym certifikatom, ale aj tak ma to blokuje v testovani
[JavaFX Application Thread] INFO eu.europa.esig.dss.validation.CommonCertificateVerifier - + New CommonCertificateVerifier created.
[JavaFX Application Thread] INFO eu.europa.esig.dss.token.AbstractSignatureTokenConnection - Signature algorithm : SHA256withRSA
[JavaFX Application Thread] ERROR com.octosign.whitelabel.ui.Main$ExceptionHandler - [NOT EXPECTED] Error: java.lang.RuntimeException
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1857)
	at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1724)
	at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
	at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
	at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8792)
	at javafx.controls/javafx.scene.control.Button.fire(Button.java:203)
	at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208)
	at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
	at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
	at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
	at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
	at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3897)
	at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1878)
	at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2623)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449)
	at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:557)
	at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:943)
	at javafx.graphics/com.sun.glass.ui.mac.MacView.notifyMouse(MacView.java:127)
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:77)
	at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:275)
	at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84)
	at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1854)
	... 44 more
Caused by: eu.europa.esig.dss.model.DSSException: Unable to sign : sun.security.pkcs11.wrapper.PKCS11Exception: CKR_PIN_INCORRECT
	at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:88)
	at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:66)
	at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:58)
	at com.octosign.whitelabel.signing.SigningManager.signASiCWithXAdES(SigningManager.java:70)
	at com.octosign.whitelabel.signing.SigningManager.sign(SigningManager.java:38)
	at com.octosign.whitelabel.ui.MainController.signDocument(MainController.java:267)
	at com.octosign.whitelabel.ui.MainController.onMainButtonAction(MainController.java:197)
	... 55 more
Caused by: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_PIN_INCORRECT
	at jdk.crypto.cryptoki/sun.security.pkcs11.P11Signature.engineSign(P11Signature.java:671)
	at java.base/java.security.Signature$Delegate.engineSign(Signature.java:1423)
	at java.base/java.security.Signature.sign(Signature.java:712)
	at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:142)
	at eu.europa.esig.dss.token.AbstractSignatureTokenConnection.sign(AbstractSignatureTokenConnection.java:82)
	... 61 more
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_PIN_INCORRECT
	at jdk.crypto.cryptoki/sun.security.pkcs11.wrapper.PKCS11.C_Sign(Native Method)
	at jdk.crypto.cryptoki/sun.security.pkcs11.P11Signature.engineSign(P11Signature.java:650)
	... 65 more

.deb balíček je "príliš moderný", v Debian bullseye sa nenainštaluje

# dpkg -i autogram_1.99.9-1_amd64.deb

dpkg-deb: error: archive 'autogram_1.99.9-1_amd64.deb' uses unknown compression for member 'control.tar.zst', giving up
dpkg: error processing archive autogram_1.99.9-1_amd64.deb (--install):
 dpkg-deb --control subprocess returned error exit status 2
Errors were encountered while processing:
 autogram_1.99.9-1_amd64.deb

(p. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=892664)

Ak to skompilujem ručne, autogram-1.0.0.jar na bullseye spustiť viem, snáď sa preto oplatí podporovať inštaláciu i na "starších" systémoch.

Flow podpisovania - predvybraty nejaky certifikat

Neviem nakolko je to relevantne, ale viem si predstavit, ze niektory pouzivaju aj ine certifikaty z karty.
Navrhujem zobrazit vsetky certifikaty v zozname pod dokumentaom alebo vedla dokumentu a iba pre-selectnut "ten spravny" ktory si myslime ze uzivatel bude chciet.

Nemoznost podpisat cez API prilohu, ktora nema filename

Cez API sa neda podpisat subor ak sa neposle filename (zhavaruje to). Kedze:

public void saveToFile(Document document) {
        try {
            if (!(fileExists(savedDocument))) {
                var prefix = Files.getNameWithoutExtension(document.getFilename());
                var suffix = "." + Files.getFileExtension(document.getFilename());

                savedDocument = File.createTempFile(prefix, suffix);
                savedDocument.setExecutable(true, false);
                Files.write(document.getContent(), savedDocument);
            }
            savedDocument.deleteOnExit();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

document.getFilename je null a na getNameWithuoExtension to padne.

Toto treba cele domysliet, ze ako sa bude detekovat typ suboru, ktory je potrebny pre vizualizaciu a co vlastne dovolime vizualizovat (resp zobrazit otvorenim). Mozu to byt podvhnute subory co otvara nove vektory utoku. Ktovie co sa stane, ked podvrhnem png alebo nieco a vo vnutri bude nieco uplne ine. Zatial riesene whitelistingom, ale neviem ci to je nepriestrelne.

PS. Taktiez sa mi tam dost nepaci ten setExecutable, kedze moze ist o podvrhnuty subor.

UX stylovanie modalov/errorov

S pomocou @TomaStolc (...alebo on s nasou pomocou) ideme riesit UX/UI stranku podpisovaca, aktualny ciel je nastylovat modaly - info/warning/error (najma error) podla typu chyby atd.

Podrobny zoznam som spisal sem do tabulky:
popup-list.ods

[ predosla UX diskusia - archiv je tu: #9 ]

Instalacia na Debiane - UX

Nainstaloval som na Debian testing stiahnuty deb file (1.99)

Chcel som spustit z konzoly a nevedel som najst. Az @jsuchal mi ukazal, ze ho najdem v menu vo window manageri.

Binarky su v /opt/autogram/bin/, co samozrejme nemam v PATH.

Navrhy na zvazenie:

  • instalovat aspon binarku alebo linku na nu do standartnejsich ciest (/usr/local/bin?)
  • Premenovat binarku z Autogram na autogram (male a)
  • doplnit popis do deb balika? Pole Description je iba "Autogram"
  • doplnit info do README na github?

CLI mod

Podpisovac by sa mal vediet pustit aj v CLI mode, toto by mala byt pomerne lahka uloha, staci implementovat (dokoncit) https://github.com/slovensko-digital/autogram/blob/main/src/main/java/digital/slovensko/autogram/ui/cli/CliUI.java kedze je tam taka polorozrobena verzia + poriadne nastavit vsetko cez vstupne argumenty.

Cielom je, aby si vedel clovek pustit podpisovac aj cez konzolu a podpisat viacero suborov naraz - napriklad posles cely folder co sa ma vypodpisovat a on to vsetko podpise a ulozi do ineho foldera.

Neviem co znamena tlacitko "zmenit"

Pri podpisovani nie je (vraj) zrejme, co sa stane ked kliknem na tlacitko "zmenit".
image

Nemam na toto silny nazor, ale "zmenit podpisovy certifikat" je uz pomerne dlhe. UXaci pomoc.

Podpora pre PDF

Chceme nativne podporovat aj PDF. Jakub navrhuje pouzit https://mozilla.github.io/pdf.js/ vo webview. Tento napad sa mi paci.

Treba vsak overit ake pdf je mozne podpisovat, pokial viem, moze sa pouzivat len nejaka archivna forma - mozno to riesi DSS samo.

Podpora pre slovensky datacontainer a podpisy vseobecne

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)

Handler pre autogram:// je potrebné manuálne zaregistrovať na Linuxe pre Firefox a Chromium

Mám nainštalovaný Autogram 1.99.9 na Ubuntu 22.10 s X11 a Gnome 43.1.

Dám do browsera napr autogram://go. Google Chrome normálne hodí pop up, či chcem otvoriť Autogram. Firefox a Chromium otvoria nejaký xdg-desktop-portal s hláškou, že taký protokol nepozná.

V termináli som zbehol update-desktop-database ~/.local/share/applications a už to fungovalo. Vieme niečo upraviť tak, aby tento manuálny krok nebol potrebný?

Podpora pre stare OP

Vážení integrační partneri,

dovoľujeme si vás informovať o konečnom znení vyhlášky o uznaných spôsoboch autorizácie a súvisiacich zmenách v centrálnej elektronickej podateľni (CEP), o novej verzii aplikácie D.Signer/XAdES so zobrazovaním certifikátov pre uznaný spôsob autorizácie, zasielaní výsledku overenia podpisov odosielateľovi a odlišovaní podpisu kvalifikovanej služby validácie a uchovávania.

  1. Vyhláška o uznaných spôsoboch autorizácie

Na základe pripomienok v medzirezortnom pripomienkovom konaní k vyhláške o uznaných spôsoboch autorizácie, budú ako uznaný spôsob autorizácie akceptované aj všetky zdokonalené elektronické podpisy založené na kvalifikovanom certifikáte, bez ohľadu na vydavateľa kvalifikovaného certifikátu.

Vyhláška bude definovať dva uznané spôsoby autorizácie: autorizáciu dokladom a zdokonalený elektronický podpis založený na kvalifikovanom certifikáte, pričom obe tieto možnosti sú z technického hľadiska zdokonalený elektronický podpis založený na kvalifikovanom certifikáte a obe sa budú vyhodnocovať ako „Uznaný spôsob autorizácie“.

Vyhláška bude mať účinnosť od 1.1.2023 na obmedzené časové obdobie do 30. júna 2023.

Počas novembra 2022 bude v testovacom prostredí ÚPVS nasadená úprava centrálnej elektronickej podateľne s podporou overovania uznaného spôsobu autorizácie.

Predmetom zmeny je výlučne doplnenie číselníka vo výsledku overenia o nový legislatívny typ podpisu „5” - Uznaný spôsob autorizácie, ktorý sa bude používať pre zdokonalený elektronický podpis založený na kvalifikovanom certifikáte, a to výlučne počas obdobia účinnosti vyhlášky. Po skončení účinnosti vyhlášky sa bude pre tento typ podpisu používať legislatívny typ podpisu „2“ - Zdokonalený elektronický podpis, založený na kvalifikovanom certifikáte.

Potrebné informácie zverejnené od 20. októbra 2022 v integračnom manuáli CEP boli aktualizované dňa 18.11.2022. Konkrétne, bol uznaný spôsob autorizácie rozšírený na všetky zdokonalené elektronické podpisy založené na kvalifikovanom certifikáte.

Uznaný spôsob autorizácie je v zmysle novely vyhlášky zdokonalený elektronický podpis založený na kvalifikovanom certifikáte.

Informácie o uznanom spôsobe autorizácie sú zverejňované v špecifikácii na portáli slovensko.sk v časti technické informácie.

Ak orgán verejnej moci prevádzkuje elektronickú podateľňu, resp. službu pre validáciu podpisov vlastnými prostriedkami, musí si jej aktualizáciu pre odlišovanie uznaného spôsobu autorizácie zabezpečiť vo vlastnej réžii, najmä, ak túto formu autorizácie bude akceptovať.

  1. Úprava aplikácie D.Signer/XAdES

Aplikácia D.Signer/XAdES bude v decembri 2022 aktualizovaná o nové funkcie:

  1.  Automatická kontrola platnosti podpisového certifikátu zvoleného používateľom (cez OCSP alebo CRL) a neumožnenie podpísania so zrušeným certifikátom, pokiaľ používateľ takúto možnosť explicitne nedovolí v nastaveniach aplikácie.
    

Aplikácia od svojho vzniku umožňuje podpisovanie aj zrušenými certifikátmi.

  1.  Predvolený filter certifikátov zobrazovaný používateľovi bude zobrazovať aj kvalifikované certifikáty bez príznaku QcSSCD/QSCD, to znamená certifikáty pre zdokonalený elektronický podpis založený na kvalifikovanom certifikáte.
    

Používatelia, ktorí budú mať vydané takéto kvalifikované certifikáty ich preto budú predvolene vidieť v ponuke certifikátov v aplikácii D.Signer/XAdES pri každom podpisovaní. (Pozn.: Bez úpravy aplikácie by používatelia museli kliknúť na predvolený filter a zvoliť „zrušiť filter“.)

Pokiaľ pre podpisovanie podania alebo príloh v elektronických službách na špecializovanom portáli je vyžadovaný výlučne KEP a nemá byť umožnené podpisovanie so zdokonaleným elektronickým podpisom založeným na kvalifikovanom certifikáte, gestor služby má nasledovné možnosti:

§ Implementovať na špecializovanom portáli volanie podpisovej aplikácie s filtrom, ktorý predvolene skryje kvalifikované certifikáty pre zdokonalený elektronický podpis založený na kvalifikovanom certifikáte,

§ Overovať vytvorené podpisy a automaticky používateľa informovať, ak jeho podpisy nebudú spĺňať požiadavky.

Aplikácia od verzie zverejnenej 30. júna 2022 kontroluje dostupnosť aktualizácií automaticky, preto predpokladáme, že väčšina používateľov ju bude mať nainštalovanú v krátkom čase po zverejnení aktualizácie.

Security

Tu je diskusia ohladom security:

Kedze podpisovanie je extremne chulostiva operacia s dalekosiahlymi dosledkami (viem previest cely svoj majetok), tak si musime davat velky pozor.

  • okienko, kde sa zobrazuje vizualizacia musi byt extremne osekany sandbox. vypol by som tam JS aj vsetko. Pre PDF bude povoleny pdf.js
  • webview na vizualizaciu sa smie pouzivat len na vizualizaciu a nic ine. tlacitko "podpisat", musi byt uplne mimo tohto.
  • http server nesmie byt otvoreny do sveta, ale dostupny len lokalne. ak ma niekto staticku ipcku, urcite nechceme, aby mu tam niekto "zvonka" nieco podstrcil.
  • hodil by sa aj nejaky security audit, ked budeme mat alfa verziu hotovu.

CLI / batch mod

Niktori nasi klienti pouzivaju podpisovac na hromadne podpisovanie, cize by sa im hodil sposob, ako podpisovac spustit z prikazoveho riadku v rezime, ze mu poslu zoznam dokumentov/folder a on ich podpisuje podstupne rad za radom. Taktiez by tu mala byt extremne nebezpecna operacia, ze sa podpisuje bez vizualizacie.

Bezny scenar je taky, ze sa toto robi mandatnym certifikatom alebo nejakym klucom, ktory nevyzaduje PIN pri kazdom dokumente ale iba raz.

Logging - Chybajuci backend pre slf4j

mozno robim ja nieco nespravne, ale logovanie mi nefunguje (pouziva sa noop) kym si nepridam v pom.xml do dependencies napriklad


        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.6</version>
        </dependency>

mozno je to by design, ale mohli by sme to hodit aspon do readme ako rozbehat logovanie?

Antialiasing v UI

Na MacOS ked pustim podpisovac, tak vsetky textiky su s chybnym antialiasingom.
Hral som sa s tym a pomoze pridat do shared.css:

* {
  ...
  -fx-font-smoothing-type: gray;
}

Dalej som to ale neskumal.

Bez antialiasingu

Bez antialiasingu

S antialiasingom

S antialiasingom

Vytvoriť balíky pre Debian

Dobre by bolo vytvoriť balíky pre Debian rovno v Debiane.

Žiaľ, toto v plnej miere nebude jednoduché, keďže v Debiane momentálne absentuje balík pre EU DSS.
Takže asi najlepšie by bolo začať robiť balík podľa všetkých pravidiel a štandardov Debian, ale momentálne pribaliť EU DSS, prípadne iné závislosti ako "vendorovaný tarball". To by sa potom dalo buildovať aj v CI.

Originally posted by @andrewshadura in #188 (comment)

Bundling with JRE

Vyzera, ze bundlujeme JDK, co asi nie je potrebne a je tak 2.5x vacsie ako by mohlo byt, keby sme bundlovali JRE. Javisti, viete toto kuknut, ze ako to spravit, aby to pre release pouzivalo JRE?

Oracle java, JavaFX ...

Ake su limitacie pouzitia oracle jre/jdk? Neni tam potrebne nieco platit? Nepoznam Java svet, ale viem, ze javafx tiez bol problem. Nepozname nejake free alternativy?

Prejst na checked exceptions

Z diskusie na slacku vyplynulo, ze best practice su checked exceptions. Co som robil maly pokus, tak by to nemuselo byt take tazke dodrzat, lebo my exceptions dokonca vraciame (ako error).

@sabomichal vedel by si sa na toto pozriet?

Náhľady pri .asice kontajneroch

Autogram vie pridať podpis do asicu vpohode. Bolo by fajn možno ešte zobrazovať podpisovaný súbor (treba ho vybrať z kontajneru).

Podpisovanie na osx Ventura pada s chybou

Pri nacitani certov spadne inicializacia PKCS11 storu:

com.octosign.whitelabel.error_handling.UserException: error.tokenNotAvailable.description at com.octosign.whitelabel.signing.token.Token.getAllPrivateKeys(Token.java:56) at com.octosign.whitelabel.signing.token.Token.buildCertificates(Token.java:39) at com.octosign.whitelabel.signing.token.Token.initialize(Token.java:27) at com.octosign.whitelabel.signing.token.PKCS11Token.createToken(PKCS11Token.java:24) at com.octosign.whitelabel.signing.token.PKCS11Token.<init>(PKCS11Token.java:13) at com.octosign.whitelabel.signing.KeystoreType.lambda$static$0(KeystoreType.java:9) at com.octosign.whitelabel.signing.KeystoreType.createToken(KeystoreType.java:20) at com.octosign.whitelabel.signing.token.Token.fromDriver(Token.java:31) at com.octosign.whitelabel.ui.MainController.loadSigners(MainController.java:215) at com.octosign.whitelabel.ui.MainController.onMainButtonAction(MainController.java:195) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:77) at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:275) at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84) at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1854) at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1724) at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.base/javafx.event.Event.fireEvent(Event.java:198) at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8792) at javafx.controls/javafx.scene.control.Button.fire(Button.java:203) at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208) at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274) at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247) at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.base/javafx.event.Event.fireEvent(Event.java:198) at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3897) at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1878) at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2623) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449) at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:557) at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:943) at javafx.graphics/com.sun.glass.ui.mac.MacView.notifyMouse(MacView.java:127) Caused by: eu.europa.esig.dss.model.DSSException: Can't initialize Sun PKCS#11 security provider. Reason: load failed at eu.europa.esig.dss.token.Pkcs11SignatureToken.getKeyStore(Pkcs11SignatureToken.java:340) at eu.europa.esig.dss.token.AbstractKeyStoreTokenConnection.getKeys(AbstractKeyStoreTokenConnection.java:68) at com.octosign.whitelabel.signing.token.Token.getAllPrivateKeys(Token.java:54) ... 64 more Caused by: java.io.IOException: load failed at jdk.crypto.cryptoki/sun.security.pkcs11.P11KeyStore.engineLoad(P11KeyStore.java:861) at java.base/java.security.KeyStore.load(KeyStore.java:1507) at eu.europa.esig.dss.token.Pkcs11SignatureToken.getKeyStore(Pkcs11SignatureToken.java:316) ... 66 more Caused by: javax.security.auth.login.LoginException at jdk.crypto.cryptoki/sun.security.pkcs11.SunPKCS11.login(SunPKCS11.java:1512) at jdk.crypto.cryptoki/sun.security.pkcs11.P11KeyStore.login(P11KeyStore.java:879) at jdk.crypto.cryptoki/sun.security.pkcs11.P11KeyStore.engineLoad(P11KeyStore.java:852) ... 68 more Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_FUNCTION_CANCELED at jdk.crypto.cryptoki/sun.security.pkcs11.wrapper.PKCS11.C_Login(Native Method) at jdk.crypto.cryptoki/sun.security.pkcs11.SunPKCS11.login(SunPKCS11.java:1496) ... 70 more

Chytať pokazené binárne súbory na podpis

Keď pošleme nevalidné PDF alebo PNG (pokazené base64), niekedy to spadne, inokedy nezobrazí nič v náhľade (podľa toho, ako veľmi pokazíme - náhodne som mazal znaky). Možno by bolo fajn to tu nejako chytať a v tom prípade zobraziť nejaký error.

public void initialize() {
refreshSigningKey();
if (signingJob.isPlainText()) {
showPlainTextVisualization();
} else if (signingJob.isHTML()) {
showHTMLVisualization();
} else if (signingJob.isPDF()) {
showPDFVisualization();
} else if (signingJob.isImage()) {
showImageVisualization();
} else {
showUnsupportedVisualization();
}
}

cc @jsuchal

Co urobit s PDF/A konverziou?

Na slovensko sk vyleti 2x alert ked idem podpisat pdf ako prilohu.

image

image

Avsak request odpali dobre aj sa PDF zobrazi. Cize toto asi treba len ignorovat.

Distribucia

Pain point desktop aplikacii je distribucia. #5 rozprava o distribucii updatov, ale chybaju este rozhodnutia o prvotnej distribucii.

V mojej verzii a kostre je spravene balenie do .zip pre vsetky 3 platformy a mam nacrtnute aj zaregistrovanie custom protokolu - na Windowse je to sucast .exe launchera, ktory pri spusteni overi ci su spravne nastevene veci v registri, ostatne platformy uz menej automatizovane. To znamena, ze momentalne na mojej strane to mam ako nepodpisanu "portable" aplikaciu.

Predpokladam ale, ze budete chciet:

  1. Spravit installer/klasicke packages pre danu platformu - t.j. .exe installer pre Window, .dmg pre macOS, .AppImage/.deb/.rpm pre Linux.
  2. Podpisat appku na Windowse a macOS - toto je super dolezite! Inak to bezny clovek nespusti. Na macOS staci Apple Developer - je potrebne tu zabalenu appku podpisat a notarizovat (nechat prejst cez ich servery so spravne vyplnenym .plist om a drsnejsimi security pravidlami na appke - Octosign tym prechadza, takze by nemal byt problem). Na Windowse je to horsie, idealne je podpisane cez Extended Validation code signing cert. Inak to bude davat vela false positives - Windows to nebude chciet spustit, rozne antiviraky to budu davat do karanteny etc. EV CSC je ale prakticky vzdy hardvery token, takze ak to chcete mat von pre ludi v dohladnej dobe tak by to bolo fajn zacat riesit. Naposledy som ho kupoval cez Microsoft s nejakou zlavou 50%, takze to stalo "len" nejakych 500E rocne.

Planuje sa pridavanie do obchodov/repozitarov?

@jsuchal Feel free dat tomu spravnu prioritu (milestone).

Nepodporovany .txt na podpisanie

Na slovensko.sk chcem podpisat .txt subor ako prilohu a podpisovac vrati 400 - nepodporovany format (co je zle spravanie).

@pomali ake tam posielame v requeste parametre? Je to nejako natvrdo? Lebo tuto ak spravne pozeram sa ide podla filename a toto nedava zmysel lebo toto vyzera na request kde je datacontainer (tu nie je datacontainer ale surove txt).

image

Request by mal vyzerat skor nejako takto (toto je pre png)

image

Refactoring internej logiky

Momentalne je interna logika extremne prekomplikovana, ma prilis vela zbytocnych medzikusov, cielom je ju podstatne zjednodusit a adresovat aj niektore problemy, ktore sa dnes riesia polhackmi. Napr odchytavanie stavov (sice vynimocnych ale beznych) a riadenie vynimkami. Nemoznost validne podpisat ak sa vyvolaju dve okna naraz...

Riadenie flowu by malo byt vysokourovnove takto:

  1. spusti program a cakaj na signingjob (je jedno ci to pride z cli, ui alebo servera)
  2. signingjob spusti a ak treba vypytaj si cim to ma podpisovat a ako
  3. podpis to
  4. odosli odpoved podla typu z kroku 1.

Samozrejme toto je komplikovanejsie s javafx kedze sa tam medzi threadmi posuvaju cakania na vstupy od usera a javafx ma len jeden "ui updater thread" na ktorom by sa nemalo vykonavat nic co dlho trva. Cize vsetko je taky nejaky actor model, co si posiela callbacky, resp. odovzdava riadenie callbackmi/async volaniami a nie synchronne. Toto specialne pri vybere certifikatu a podpisovani cez eid vidiet lebo tam sa odovzadva riadenie pkcs libke co vyvola okno.

Zaroven spravanie pre mandatny certifikat (pri ziskavani PINu) je ine, lebo toto naopak sa ocakava, ze sa poskytne z javafx. Toto treba doriesit.

UX diskusia

Tu otvorme diskusiu ohladom pouzivatelskeho rozhrania.

  • Bezny scenar (napr. navody.digital) je taky, ze pouzivatel je prihlaseny (uz zadaval BOK) a podpisovanie mu opat vyziada BOK. Treba mu nejako vysvetlit co sa deje a preco to od neho ziada znova BOK.
  • Nacitanie certifikatov trva celkom dlho (sekundu aj cosi), z UX pohladu je potrebne, tam zobrazit predtym, ako sa zavola ta funkcia zobrazit nejaky loader "Nacitavanie certifikatov" - tento text treba vymysliet, lebo toto bezny pouzivatel nechape. Podobny lag je aj pri podpisovani. Opat treba spustit predtym loader. Mozno je podobny lag aj pri spatnom posielani dat do prehliadaca. Aj tam by sa malo nieco asi zobrazit.
  • Start by mal byt co najrychlejsi, netusim ako rychlo vie nastartovat Java, ale binarky cez https://www.graalvm.org/ vraj su bleskove. Neskusal som.
  • Z UX pohladu pre scenar, ze podpisujem toho viac je velmi ziaduce, aby sa nespustala aplikacia vzdy odznova, ale po podpisani bezala povedzme este 5 minut. Pri dalsom volani sa okamzite otvori okno a dokonca budu nacitane aj certifikaty (netreba zadavat BOK). Toto treba asi domysliet aj clientside, ak sa to bude rozbiehat na random porte, tak to musi klient nejako u seba drzat, aby to posielal stale na "beziaci komponent".
  • Ak toho podpisujem viac, malo by sa otvorit "rozne okno" pre kazdy dokument. Toto asi vytvara zavislost na multithread http localhost server.

Zmenit domenu pouzivanu na MacOS Safari

treba zmenit domenu ktora sa pouziva na https hack na safari
teraz je pri generovani certo DN yoogle.com,
a asi to je pouzite aj niekde v aplikacii alebo extension? (teraz to neviem najst)

Release proces je divny

Momentalne je GH action release proces naviazany na push, co je mega divne, malo by sa to odpalit na event tagnutia verzie. mvn command by sa mal pustit rovnaky aj s testami.

Bezny CI proces by nemal robit packaging (si myslim), ale len zbehnut testy a skusit build.

Flow popisovanie - neviem co mam robit

Ked dam podpisovat dokument, tak laika nemusi napadnut, ze ma kliknut na "nacitat cerifikaty".
Mohlo by bolo dobre rovno ich rovno requestnut z karty, ale chapem ze chceme dat asi moznost uzivatelovi prestudovat si co vlastne ide podpisovat.
Mozno staci premenovat tlacidlo na nieco ako "Zacat podpisovanie".

Byrokracia

Ake su podmienky pre vytvorenie noveho podpisovaca? Je potrebne to niekde hlasit? Certifikovat?

(Toto je skor placeholder issue pre mna @jsuchal)

Vypnutie a zapnutie extension bez refreshu

Toto je mozno prilis zlozite, ale mam takyto scenar pouzitia:

"nejde mi nieco podpisat a chcem vypnut podpisovac/extension a skusit original". Toto vsak vyzaduje refresh okna, cize napr na slovensko.sk stratim podanie. Co nie je uplne idealne.

@pomali vidis nejaku cestu z tohto von?

Spravanie pri zatvarani okna na MacOS

Priatelia jablckari tuto potrebujeme pomoct.

Momentalne sa Autogram pri kliknuti na close (x) zavrie a vypne. Ukazalo sa, ze toto nie je vo svete MacOS standardne spravanie. Ocakava sa, ze app dalej bezi, len je "minimalizovana". Naopak pri Linux a Win je kliknutie na close (x) prikaz na zastavenie aplikacie.

V principe by fix mohol byt hnusny platform dependent switch, ale asi trivialny. Kliknutie na close v hlavnom okne na mac proste bude znamenat minimalizaciu. Pripadne sa spytame, ze ci chce naozaj zavriet Autogram.

Napady?

PS. Pre podpisovacie okna by som nechal spravanie, ze close zrusi podpisovanie (neda sa k nemu vratit) - je to proste "podpisovanie", ktore si zavrel. Tam to je ocakavane.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.