slovensko-digital / autogram Goto Github PK
View Code? Open in Web Editor NEWNový, krajší a lepší nástroj na podpisovanie.
License: European Union Public License 1.2
Nový, krajší a lepší nástroj na podpisovanie.
License: European Union Public License 1.2
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?
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.
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 ]
Tu diskutujeme ako bude fungovat API:
Zatial je zhoda, ze to bude fungovat nejako takto:
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:
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.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.
https://eidas.disig.sk/sk/kvalifikovane-certifikaty/podpora/qscd-zariadenia/
Nie vsetky vieme detekovat a daju sa pouzit. Tuto mozno dava zmysel spravit aj nejaky fallback na lubovolnu pkcs kniznicu.
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:
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.
(dalsie vylepsenie moze byt zmenit tohoto panacika - ale to neviem ako)
Originally posted by @pomali in #183 (comment)
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).
Request by mal vyzerat skor nejako takto (toto je pre png)
Swagger ťahá css a js z internetu. Tým pádom nefunguje iba lokálne. Nie je to funkčný problém, ale bolo by pekné, ak by tieto assety mal lokálne:
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.
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?
Autogram vie pridať podpis do asicu vpohode. Bolo by fajn možno ešte zobrazovať podpisovaný súbor (treba ho vybrať z kontajneru).
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)
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
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?
Skusil som podpisat PDF, ale vracia to .asice (a nejake zvlastne, nepodpisane). Zatial neviem cim to je.
https://schranka.slovensko.sk/FormConstructor/Default.aspx?IdService=369549
https://stackoverflow.com/questions/72401149/limit-set-by-feature-secure-processing
Fakt to chce chytat tie chyby z transform
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)
Ake su podmienky pre vytvorenie noveho podpisovaca? Je potrebne to niekde hlasit? Certifikovat?
(Toto je skor placeholder issue pre mna @jsuchal)
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)
# 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.
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.
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.
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:
Planuje sa pridavanie do obchodov/repozitarov?
@jsuchal Feel free dat tomu spravnu prioritu (milestone).
(toto moze byt problematicke iba pre mna)
info:
postup
[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
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?
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:
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.
/info endpoint je naviazany na root. Bud zmenme swagger alebo endpoint.
Vyzera, ze je nova verzia 3.0.x - treba pozriet co je nove a skusit upgrade, resp spisat dopady.
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:
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)
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.
Tu otvorme diskusiu ohladom pouzivatelskeho rozhrania.
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?
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.
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.
cc @jsuchal
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ý?
Napriek tomu, ze som nainstaloval Autogram z https://github.com/slovensko-digital/autogram/releases/latest, hned pri prvom starte mi hlasil, ze na GH je aktualnejsia verzia.
MacOS: 13.3.1
Autogram: 1.99.9
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.
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.
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".
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.
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.
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ť.
Aplikácia D.Signer/XAdES bude v decembri 2022 aktualizovaná o nové funkcie:
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.
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.
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?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.