Italian community of Lazarus and Free Pascal
Programmazione => Componenti Aggiuntivi => Topic aperto da: tito_livio - Aprile 05, 2023, 12:13:22 pm
-
Buongiorno a tutti,
avrei bisogno di firmare digitalmente dei documenti pdf da programma, avrei risolto ma in un modo che ritengo farraginoso.
La situazione è questa:
-Non si tratta però di un documento ogni tanto ma di 50-100 documenti prodotti al giorno, quindi non posso far digitare ogni volta la password ma vorrei
che l'utente battesse una volta sola la password quando apre il programma;
-Il certificato è quello che sta dentro il pennino che rilascia la Camera di Commercio oppure Aruba;
-I pdf sono prodotti dal programma stesso;
-Lanciando programmi esterni trovati in rete, si può firmare ma non mi è stato possibile passargli la password come parametro, con questo tipo di certificato non funziona.
Avete qualche idea o esperienza in merito?
Grazie anticipatamente a tutti.
-
Ciao,
non conosco l'argomento, per cui se ti dovesse arrivare una risposta più intelligente, ignora quello che scrivo !!!
Se riesci ad individuare e portare in primo piano la finestrella in cui l'utente dovrebbe scrivere la password, puoi farla scrivere tu dal programma: con Lazarus puoi simulare la pressione dei tasti della tastiera, tramite il componente aggiuntivo "MouseAndKeyInput".
Ciao, Mario
-
Ciao,
non conosco l'argomento, per cui se ti dovesse arrivare una risposta più intelligente, ignora quello che scrivo !!!
Se riesci ad individuare e portare in primo piano la finestrella in cui l'utente dovrebbe scrivere la password, puoi farla scrivere tu dal programma: con Lazarus puoi simulare la pressione dei tasti della tastiera, tramite il componente aggiuntivo "MouseAndKeyInput".
Ciao, Mario
Interessante!
-
Ciao,
non conosco l'argomento, per cui se ti dovesse arrivare una risposta più intelligente, ignora quello che scrivo !!!
Se riesci ad individuare e portare in primo piano la finestrella in cui l'utente dovrebbe scrivere la password, puoi farla scrivere tu dal programma: con Lazarus puoi simulare la pressione dei tasti della tastiera, tramite il componente aggiuntivo "MouseAndKeyInput".
Ciao, Mario
Strada pericolosetta. Se per qualche motivo la finestra non sale come top position son dolori.
-
Strada pericolosetta. Se per qualche motivo la finestra non sale come top position son dolori.
Certo, la cosa va valutata bene, ma da quello che c'è scritto nel primo post, io capisco che l'utente che dovrebbe digitare la password è lo stesso che lancia il suo programma, quindi lui la password la sa già !!!
L'unico rischio che mi viene in mente, è che invece di scrivere la password dove dovrebbe, il programma la scriva nella finestra sbagliata, come blocco note, edito o cose simili, ed in quel momento passa qualcuno alle sue spalle e la vede
Ciao, Mario
-
Ciao, mi stavo cimentando anche io nella cosa (ho la chiavetta della CCIAA) sempre nel concetto della firma digitale ma pure per l'autenticazione della persona.
Sono per adesso arrivato tramite le API di Windows a riconoscere la chiavetta (o meglio il dispositivo generico) e a capire che ci sono le firme (anche ad elencarle). Poi non avevo più tempo da dedicarci e ho messo in parcheggio il tutto.
Simili cose le ho già fatte, basterebbe cercare con un programma SPY qualsiasi l'identificativo della finestra (nome, classe, etc ...) e poi con l'API FindWindowEx (e funzioni affini) ricercarla dall'eseguibile.
Non è complesso, anzi ...
Vedo di postare qualcosa.
-
Ehm ... sarebbe banale, ma la finestra può essere identificata solo ed esclusivamente se si opera con privilegi elevati (cioè non solo user appartenente al gruppo amministratori, ma anche con elevazione dei privilegi).
Si potrebbe tentare di impersonare un "amministratore" direttamente dal programma, ma non sò se ciò sia sufficiente, comunque credo che ciò non sia possibile nella maggiora parte delle casistiche (ad esempio se il programma deve girare in azienda .... o in un ufficio pubblico).
Questo usando FireFox, occorre vedere se usando il tool esterno invece di firefox (come tu indicavi) sia possibile identificare la finestra senza privilegi.
Ciao
-
non conosco l'argomento ma credo che il tutto dovrebbe essere compatibile con comandi openssl
nel senso che se si trovasse il modo di mettere le firme con linea di comando (usando openssl) già si sarebbe un passo avanti: basterebbe fare un wrapper
fatto il wrapper basta capire quali funzioni vengono usate da openssl per poi tentare di farlo con lazarus/free pascal
Edit:
se il certificato è tipo x509, si potrebbe provare a partire da quanto riportato qua
https://stackoverflow.com/questions/10782826/digital-signature-for-a-file-using-openssl#18359743 (https://stackoverflow.com/questions/10782826/digital-signature-for-a-file-using-openssl#18359743)
-
non conosco l'argomento ma credo che il tutto dovrebbe essere compatibile con comandi openssl
nel senso che se si trovasse il modo di mettere le firme con linea di comando (usando openssl) già si sarebbe un passo avanti: basterebbe fare un wrapper
fatto il wrapper basta capire quali funzioni vengono usate da openssl per poi tentare di farlo con lazarus/free pascal
Edit:
se il certificato è tipo x509, si potrebbe provare a partire da quanto riportato qua
https://stackoverflow.com/questions/10782826/digital-signature-for-a-file-using-openssl#18359743 (https://stackoverflow.com/questions/10782826/digital-signature-for-a-file-using-openssl#18359743)
Purtroppo il tutto non è compatibile con OpenSSL, anzi tutt'altro. Questo perchè certificato e chiavi sono in un contenitore "privato" e non sono in alcun modo esportabili.
Occorre operare tramite la DLL fornita con la chiavetta (Bit4ID) che dovrebbe essere compatibile con PKCS#11 ...
-
quindi il file del certificato non è su un file system esposto per la copia?
-
No. E le chiavi private non sono in alcun modo esportabili.
-
Il CSP (dalle nuove CryptoApi di Windows) è:
"Bit4id Key Storage Provider"
-
Si potrebbe partire da qui:
https://github.com/topics/pkcs11?l=java&o=asc&s=forks (https://github.com/topics/pkcs11?l=java&o=asc&s=forks)
Tutto java minuto per minuto, il linguaggio (in maniera ironica ovviamente) preferito da @nomorelogic ;D ;D ;D ;D
-
E questo un buon posto: analizzerò ciò che viene usato, visto che si interfaccia proprio con la DLL di Bit4ID (sempre che qualcun altro amante di java non voglia con gioia estrema anticiparmi).
https://github.com/napobear/Java-Digital-Signature (https://github.com/napobear/Java-Digital-Signature)
Ciao
-
https://github.com/esig
Allora guarda questo...
All'ue con furore.
-
un sacco di roba...
c'è anche il sorgente per una web app con tanto di web app online...
https://ec.europa.eu/digital-building-blocks/DSS/webapp-demo/sign-a-pdf (https://ec.europa.eu/digital-building-blocks/DSS/webapp-demo/sign-a-pdf)
-
Cmq, leggendo il codice, mi sembra di intuire che si debba creare una sezione "SIG" nel pdf.
Con il TPDFDocument non è un problema, aggiungi la sezione.
Quello che non mi è ancora del tutto chiaro è cosa ci mettano dentro.
Da una prima lettura sembra che inseriscano le informazioni su una cosa che chiamano "filter"...
Solo che poi passano alla buona e cara lib apache la creazione del pdf in quanto tale. Oppure ad una openpdf che non conoscevo.
Stilgar
Stai all'ingresso del tunnel....(inglese maccheronico)
-
Si, però sono tutti strumenti esterni.
Di pronto in Pascal non è che ho trovato tanto (qualcuno aveva tentato).
Ora mi metto di impegno e provo io.
Intanto sono riuscito a runtime a caricarmi tutte le funzioni della libreria della chiavetta .... (grazie anche a JEDI).
P.S.: e poi dicono che la FORZA .... non serve ... ;D
P.S.1: FORZA <----> JEDI(Y) .....
-
personalmente sto cercando l'algoritmo.
;)
-
polpetta avvelenata....
https://stackoverflow.com/questions/6003643/java-c-c-c-php-to-pascal-converter (https://stackoverflow.com/questions/6003643/java-c-c-c-php-to-pascal-converter)
https://forum.lazarus.freepascal.org/index.php?topic=13308.0 (https://forum.lazarus.freepascal.org/index.php?topic=13308.0)
Edit:
nel senso, questo tool non lo conoscevo ma può essere utile per convertire qualche libreria
-
(Bastaaaaaaardo) ;D ;D ;D ;D ;D
Alla Aldo Giovanni e Giacomo.
OT:
Ero incastrato nel recupero della gestione dei frame dal byte code...
Non avendo chiaro come gestirli, non so come riempire i "begin/end".
poi c'è la rogna della variabili che possono avere lo stesso nome e tipi diversi, se i metadati di debug sono attivi dentro il .class
;D
-
yes, I am
8)
-
polpetta avvelenata....
https://stackoverflow.com/questions/6003643/java-c-c-c-php-to-pascal-converter (https://stackoverflow.com/questions/6003643/java-c-c-c-php-to-pascal-converter)
https://forum.lazarus.freepascal.org/index.php?topic=13308.0 (https://forum.lazarus.freepascal.org/index.php?topic=13308.0)
Si, vuoi propri convertire TUTTE le librerie interessate ?
personalmente sto cercando l'algoritmo.
;)
L'algoritmo per firmare un PDF ? Ce ne sono tanti .... però senza avere accesso alla chiavetta in maniera nativa (o quasi) sei sempre legato a componenti di terze parti. Vorrei fare qualcosa di nativo, e sono convinto che la base sarà compatibile con le chiavette di mezzo mondo.
Tenete presente che gli stessi tool di Microsoft sono stati aggiornati più volte (e a me ultimamente nessuno stà funzionando).
Ciao
N.B.: dovrebbe funzionare anche in LINUX, teoricamente ... ma questo sarà un passo successivo.
-
Speta, stai parlando della persistenza dei certificati su dispositivi terzi?
Io stavo parlando di cosa mettere dentro il pdf (per rispondere al quesito iniziale) in modo da fare firme massive dei pdf.
La situazione è questa:
-Non si tratta però di un documento ogni tanto ma di 50-100 documenti prodotti al giorno, quindi non posso far digitare ogni volta la password ma vorrei
che l'utente battesse una volta sola la password quando apre il programma;
-Il certificato è quello che sta dentro il pennino che rilascia la Camera di Commercio oppure Aruba;
-I pdf sono prodotti dal programma stesso;
-Lanciando programmi esterni trovati in rete, si può firmare ma non mi è stato possibile passargli la password come parametro, con questo tipo di certificato non funziona.
-
polpetta avvelenata....
https://stackoverflow.com/questions/6003643/java-c-c-c-php-to-pascal-converter (https://stackoverflow.com/questions/6003643/java-c-c-c-php-to-pascal-converter)
https://forum.lazarus.freepascal.org/index.php?topic=13308.0 (https://forum.lazarus.freepascal.org/index.php?topic=13308.0)
Si, vuoi propri convertire TUTTE le librerie interessate ?
no, solo quella con l'algoritmo di cifratura
Tenete presente che gli stessi tool di Microsoft sono stati aggiornati più volte (e a me ultimamente nessuno stà funzionando).
N.B.: dovrebbe funzionare anche in LINUX, teoricamente ... ma questo sarà un passo successivo.
JEDI --> FORZA --> questo è il lato oscuro della forza...
;D ;D ;D
-
Gli algoritmi di cifratura sono "standard" con la jre.
Bisogna "tradurre" quelli se vuoi andare tradurre.
Mal che vada, capito come mettere il certificato estratto all'avvio dell'applicazione e salvato in memoria, poi si può usare dchiper (se ricordo come si scrive).
SHA256 dovrebbe essere supportato dalla libreria.
-
Drago, se sai come firmare un pdf (in dettaglio) spiega, così mi eviti di leggere un botto di codice....
-
Drago, se sai come firmare un pdf (in dettaglio) spiega, così mi eviti di leggere un botto di codice....
Non lo sò di preciso, ho sempre usato tools esterni anche io, però sono arrivato qui ...
Ho letto e decodificato il certificato, quindi teoricamente ora lo posso usare .... e senza tool esterni .... ora vedo la firma come funzia e come inserirla sia fisicamente sia graficamente in un PDF ...
-
P.S.... Tutto in puro pascal .... (Delphi per adesso per gli strumenti che ha di debug).
-
Devo aggiungere che:
-Io come tool esterno uso JsignPdf e sul sito https://jsignpdf.sourceforge.net/ ho visto che ci sono i sorgenti.
Questo programma lo uso lanciandolo dal mio prog passandogli tutti i parametri necessari.
Anche se è previsto l'invio della password, inviandola non viene considerata perché, da quello che ho capito,
il certificato dovrebbe essere tirato fuori dalla chiavetta.
Quindi ogni volta che JsignPdf viene lanciato chiede la password, dopo però JsignPdf può firmare tanti documenti
uno dopo l'altro (tutti quelli di una cartella p.e), senza chiedere niente, ma è un'operazione lunga da lanciare a fine
lavoro e questo crea un po' di problemi.
-Ho visto che FastReport stampa e firma pdf, https://www.fast-report.com/en/blog/show/multiple-digital-signatures-delphi/,
addirittura con più firme.
Non so però se è possibile salvare la password e firmare senza chiedere niente all'utente.
Ho provato a scaricare la trial per Lazarus ma non contiene i componenti nè per l'esportazione in PDF nè per inserire
aree firmabili nel report.
Forse questi componenti sono disponibili nella trial per Delphi, magari @DragoRosso, visto che hai Delphi puoi provare a
vedere se con Delphi la cosa funziona.
Non penso che userò Delphi ma credo sarebbe utile saperlo.
Grazie per la numerosa partecipazione
-
-Ho visto che FastReport stampa e firma pdf, https://www.fast-report.com/en/blog/show/multiple-digital-signatures-delphi/,
addirittura con più firme.
LazReport (o fpReport) non sò bene quale componente è di fatto FastReport ... prova a dare una occhiata.
Comunque ti confermo che su FastReport in Delphi la password può essere inserita a codice senza che venga mai chiesta all'utente.
Ma ciò non fà testo, in quanto FastReport non accede alla chiavetta ma solo ed esclusivamente a certificati su file (esclusivamente effettivamente non sò, ma ciò che ho io non ha altre scelte).
Ciao
-
Tito.
Hai provato ad inserire key-password nella riga di comando che lanci con TProcess?
Oppure se utilizzi i keystore "keystore-password" e "keystore-file"?
Sto guardando il codice del progetto che hai segnalato.
Stilgar.
-
LazReport (o fpReport) non sò bene quale componente è di fatto FastReport ... prova a dare una occhiata.
Ho visto, Lazreport è un sottoinsieme di Fastreport e molte funzionalità non le ha, tra cui quella di firmare i documenti.
Comunque ti confermo che su FastReport in Delphi la password può essere inserita a codice senza che venga mai chiesta all'utente.
Ma ciò non fà testo, in quanto FastReport non accede alla chiavetta ma solo ed esclusivamente a certificati su file (esclusivamente effettivamente non sò, ma ciò che ho io non ha altre scelte).
Ciao
Infatti, mi aspettavo che fosse così però è sempre un'informazione interessante.
Tito.
Hai provato ad inserire key-password nella riga di comando che lanci con TProcess?
Oppure se utilizzi i keystore "keystore-password" e "keystore-file"?
Ho provato ad inviare la password in entrambi i modi, sia come parametro key-password che come parametro keystore-password.
Non ho usato il parametro keystore-file perché non saprei quale file indicare, infatti il keystore dove finisce la key della penna è
WINDOWS-MY che non conserva le chiavi in un file.
Buonanotte
-
Per la chiavetta, ti avranno fornito pure un SDK per interagire via software... no?
-
Ho provato ad inviare la password in entrambi i modi, sia come parametro key-password che come parametro keystore-password.
Per esperienza, io farei questa prova:
- prova a lanciare i comandi, passando la password, da terminale, e non dal tuo programma
- se funziona, nel tuo programma, invece di lanciare il comando, lo scrivi in un file bat, lanci il bat e poi lo cancelli (al massimo, prima di cancellarlo, lo riscrivi, per evitare che sia facilmente recuperabile)
Non ho mai capito perché, ma ogni tanto, soprattutto con i comandi che non hanno "la parte grafica" e ricevono parametri, lanciati con TProcess mi danno problemi, usando invece il .bat, va tutto liscio
Ciao, Mario
-
Per la chiavetta, ti avranno fornito pure un SDK per interagire via software... no?
La chiavetta ha in dotazione i software di gestione e il software di firma (oltre che firefox portable "sicuro"). Bit4ID (che è il proprietario della tecnologia) fornisce l'SDK a pagamento. Ma fornendo l'interfaccia PKCS11# diciamo che l'SDK non è necessario.
Ci sono altri "costruttori" che forniscono anche essi l'SDK, sempre a pagamento, ma mi pare che siano più o meno tutti simili (da quello che ho letto noi forum qua e la).
La chiavetta è pensata per un uso al cliente finale, infatti viene fornita da CCIAA e Aruba.
Ciao
P.S.: e il bello che in pascal c'è meno che niente. Ci sono delle aziende che hanno fatto degli SDK per PKCS#11 standard a pagamento tramite DLL o OCX e li puoi sbizzarrirti come vuoi.
La tecnologia usata per le chiavette viene chiamata in gergo CryptoKI.
-
Non mi manca molto per terminare il wrapper funzionante in pascal per PKCS#11. Stò adattando le API all'ultima situazione di fatto (che dovrebbe essere del 2015, ma per esempio tramite Microsoft fino a 5 mesi fà riuscivo a firmare i file eseguibili, ora non più ..... >:( )
Ciao
-
Per la chiavetta, ti avranno fornito pure un SDK per interagire via software... no?
Non viene fornito l'SDK, insieme alla chiavetta, oltre al software per firmare fra le utility forniscono un'applicazione "import certificato", dopo averla eseguita i programmi di firma che stanno su PC funzionano.
Ho provato ad inviare la password in entrambi i modi, sia come parametro key-password che come parametro keystore-password.
Per esperienza, io farei questa prova:
- prova a lanciare i comandi, passando la password, da terminale, e non dal tuo programma
- se funziona, nel tuo programma, invece di lanciare il comando, lo scrivi in un file bat, lanci il bat e poi lo cancelli (al massimo, prima di cancellarlo, lo riscrivi, per evitare che sia facilmente recuperabile)
Non ho mai capito perché, ma ogni tanto, soprattutto con i comandi che non hanno "la parte grafica" e ricevono parametri, lanciati con TProcess mi danno problemi, usando invece il .bat, va tutto liscio
Ciao, Mario
Infatti ho fatto proprio così, tutte le prove con la password fra i parametri, le ho fatto da terminale mentre per l'uso normale lancio un file bat che contiene i parametri %1, %2 ecc. Anche a me spesso TProcess dà problemi.
Ciao a tutti