<--
| ||||||||||||||||||||||||||||
Changed: | ||||||||||||||||||||||||||||
< < | Vediamo quindi come utilizzare le classi di Bouncy Castle e di j4sign e per effettuare la verifica della validità di documenti firmati e marcati digitalmente con le attuali regole italiane, opportunamente modificate per utilizzarle direttamente da Perl in ambiente Apache & mod_perl struttando le potenzialità di Inline::Java. | |||||||||||||||||||||||||||
> > | Vediamo quindi come utilizzare le classi di Bouncy Castle e di j4sign e per effettuare la verifica della validità di documenti firmati e marcati digitalmente con le attuali regole italiane, opportunamente modificate per utilizzarle direttamente da Perl in ambiente Apache & mod_perl sfruttando le potenzialità di Inline::Java. | |||||||||||||||||||||||||||
Deploy classi Java
| ||||||||||||||||||||||||||||
Added: | ||||||||||||||||||||||||||||
> > | Nota: Attualmente (8 Ott 2012) è disponibile la versione 0.2.1 di "verifica-firma", ma la path fornita e stata generata partendo dalla versione 0.2.0 | |||||||||||||||||||||||||||
mkdir -p /opt/my_application/src/java cd /opt/my_application/src/java wget http://sourceforge.net/projects/j4sign/files/verifica-firma/0.2.0/verifica-firma-0.2.0-src.zip unzip verifica-firma-0.2.0-src.zip mv verifica-firma-0.2.0-src verifica-firma-0.2.0-src-GDO
wget http://www.leader.it/pub/Blog/Uso_pratico_di_InlineJava_j4sign__Bouncy_Castle_Crypto_APIs/verifica-firma-0.2.0-src.diff cd verifica-firma-0.2.0-src-GDO # applica le modifiche ... # N.B. file generato con: diff -rupN verifica-firma-0.2.0-src verifica-firma-0.2.0-src-GDO >verifica-firma-0.2.0-src.diff patch -p1 < ../verifica-firma-0.2.0-src.diff | ||||||||||||||||||||||||||||
Changed: | ||||||||||||||||||||||||||||
< < |
| |||||||||||||||||||||||||||
> > |
| |||||||||||||||||||||||||||
Added: | ||||||||||||||||||||||||||||
> > | Nota: Nel sito ufficiale di Bouncy Castle la versione jdk16-146 non è più disponibile nel sito Web ma le classi si possono reperire su altri siti in Rete oppure dal server FTP ftp://ftp.bouncycastle.org/pub/release1.46/ (attenzione che non supporta i collegamenti in "passive mode"). | |||||||||||||||||||||||||||
%CODE{"sh"}% mkdir -p /opt/my_application/lib/java cd /opt/my_application/lib/java cp -a /opt/my_application/src/java/verifica-firma-0.2.0-src-GDO/lib/j4sign-core.jar ./ | ||||||||||||||||||||||||||||
Changed: | ||||||||||||||||||||||||||||
< < | wget http://www.bouncycastle.org/download/bcmail-jdk16-146.jar wget http://www.bouncycastle.org/download/bcpg-jdk16-146.jar wget http://www.bouncycastle.org/download/bcprov-jdk16-146.jar wget http://www.bouncycastle.org/download/bctest-jdk16-146.jar wget http://www.bouncycastle.org/download/bctsp-jdk16-146.jar | |||||||||||||||||||||||||||
> > | wget --no-passive-ftp ftp://ftp.bouncycastle.org/pub/release1.46/bcmail-jdk16-146.jar wget --no-passive-ftp ftp://ftp.bouncycastle.org/pub/release1.46/bcpg-jdk16-146.jar wget --no-passive-ftp ftp://ftp.bouncycastle.org/pub/release1.46/bcprov-jdk16-146.jar wget --no-passive-ftp ftp://ftp.bouncycastle.org/pub/release1.46/bctest-jdk16-146.jar wget --no-passive-ftp ftp://ftp.bouncycastle.org/pub/release1.46/bctsp-jdk16-146.jar | |||||||||||||||||||||||||||
Deleted: | ||||||||||||||||||||||||||||
< < | wget http://www.bouncycastle.org/download/ | |||||||||||||||||||||||||||
%ENDCODE%
cd /opt/my_application/src/java/verifica-firma-0.2.0-src-GDO sh compila_java.shVerrà generata la classe nel file /opt/my_application/lib/java/VerifyService.jar File CA RootPer la verifica della firma è necessario fornire l'elenco delle CA accreditate al Cnipa (Ora DigitPA) %CODE{"sh"}% mkdir -p /opt/my_application/etc/CNIPA cd /opt/my_application/etc/CNIPA | ||||||||||||||||||||||||||||
Changed: | ||||||||||||||||||||||||||||
< < | wget http://www.cnipa.gov.it/site/_files/LISTACER_20101129.zip.p7m | |||||||||||||||||||||||||||
> > | wget http://www.cnipa.gov.it/site/_files/LISTACER_20120911.zip.p7m | |||||||||||||||||||||||||||
wget http://sourceforge.net/projects/j4sign/files/digitpa-certs/Certificati.zip
%ENDCODE%
Esempio di utilizzoFile di configurazione
# Parametri configurazione verify_service_java (vedi /etc/init.d/verify_service_java) # # Cartella usata da Inline::Java PerlSetVar VerifyService_directory "/opt/my_application/lib/java/InlineDir" PerlSetVar VerifyService_classPath "/opt/my_application/lib/java/VerifyService.jar:/opt/my_application/lib/java/bcprov-jdk16-146.jar:/opt/my_application/lib/java/bcmail-jdk16-146.jar:/opt/my_application/lib/java/bctsp-jdk16-146.jar" PerlSetVar VerifyService_confDir "/opt/my_application/etc" # Cartella in "VerifyService_confDir" contenente i certificati PerlSetVar VerifyService_cnipaDir "CNIPA" # CA Root PerlSetVar VerifyService_cnipaCa "DigitPA.cer" # Elenco delle Root CA accreditate PerlSetVar VerifyService_cnipaRoots "LISTACER_20101129.zip.p7m" # L'impronta corrisponde a quella pubblicata nella Gazzetta Ufficiale n. 122 del 27 maggio 2010 (vedi es. http://gazzette.comune.jesi.an.it/2010/122/2.htm ) PerlSetVar VerifyService_fingerprintDigitPA "20EA4FB83593DB5C4407A538C920EBC3C5B1559C" PerlSetVar VerifyService_validityMPMdate "2011-07-01 00:00:00.000 +0200" Applicazione di esempio
mkdir -p /opt/my_application/lib/java/InlineDir mkdir -p /opt/my_application/htdocs/_Inline
<FORM ACTION="./firma/put_firmato.html" target="_blank" name="my_file" METHOD="POST" ENCTYPE="multipart/form-data"> <SPAN ID="ArchiviazioneFileFirmato"> Path file: <input type="file" name="file_firmato" lenght=25> <INPUT TYPE="SUBMIT" VALUE="Archiviazione File Firmato"> </SPAN> </FORM> File /firma/put_firmato.html
<BR> <BLOCKQUOTE> <%flags> inherit => '/firma/put_firmato.comp' </%flags> <%perl> $m->clear_buffer; $m->call_next; </%perl> %# Nome del campo contenente il file scaricato <%method Field_filename>file_firmato</%method> %# Firme da cercare nel file firmato <%method Query_firme> select distinct cognome, nome, codice_fiscale from documenti inner join firmatari_documenti on firmatari_documenti.id_documento = documenti.id inner join anagrafiche on firmatari_documenti.id_firmatario = anagrafiche.id where documenti.hash_file = ? </%method> %# Per verificare se nel DB e' presente la hash calcolata <%method Query_archivio> select codice, marca_temporale from documenti where hash_file = ?; </%method> %# Per aggiornare l'archivio caricando il file firmato <%method Query_update_archivio> update documenti set tsd = ?, file_firmato = ?, file_originale = null, marca_temporale = ?, stato_rapporto = 'firmato' where hash_file = ?; </%method>Il file put_firmato.html fa riferimento al file put_firmato.comp nel quale sono implementate le procedure di verifica della firma File /firma/put_firmato.comp
Attivazione del servizio java per la verifica della firmaViene istanziata una Java Virtual Machine condivisa tra tutti i processi Apache:use Inline ( Java => 'STUDY', SHARED_JVM => 1, START_JVM => 0, PORT => 7893, AUTOSTUDY => 1, # DEBUG => 2, DIRECTORY => $r->dir_config('VerifyService_directory'), STUDY => ['it.trento.comune.j4sign.verification.servlet.VerifyService'], CLASSPATH => $r->dir_config('VerifyService_classPath') );
Inizializzazione della classe nella Java Virtual Machine condivisa, con i parametri di configurazioneI parametri di configurazione vengono letti dal file di configurazione di Apache.my $VerifyService = new HTML::Mason::Commands::it::trento::comune::j4sign::verification::servlet::VerifyService( $r->dir_config('VerifyService_confDir'), $r->dir_config('VerifyService_cnipaDir'), $r->dir_config('VerifyService_cnipaCa'), $r->dir_config('VerifyService_cnipaRoots'), $r->dir_config('VerifyService_fingerprintDigitPA') ); Verifica nel vecchio formato m7mA seconda dell'estensione del file scaricato viene utilizzato un diverso codice per la lettura dei file. Nel caso il formato del file sia m7m vengono estratti file firmato e pmarcatura temporale, contenuti nel file in formato MIME:#Parser file MIME my $parser = new MIME::Parser; mkdir "$tmpDir/mime_dir" || die "Errore creazione dir $tmpDir/mime_dir: $!\n"; $parser->output_dir("$tmpDir/mime_dir"); . . . . . . . . my $entity = $parser->parse_open($sfile); $fileP7M = $entity->parts(0)->{ME_Bodyhandle}->{MB_Path}; my $fileTSR = $entity->parts(1)->{ME_Bodyhandle}->{MB_Path}; if ($entity->parts != 2 || $fileP7M !~ m/\.p7m$/i || $fileTSR !~ m/\.tsr$/i) { $m->out("<b>Era atteso un file in formato MIME contenente un file .p7m e un file con estensione .tsr ($filename)</b><BR>"); fine(); } # data di applicazione della marcatura temporale (per la verifica della validità delle firme) my $token = $VerifyService->verifyTSR($fileTSR); # class org.bouncycastle.tsp.TimeStampToken # class org.bouncycastle.util.Store restituito chiamando token.getCertificates my $certificates = $token->getCertificates->getMatches(undef)->toArray; foreach my $cert (@$certificates){ # class $m->out('Timestamp emesso da: '.$cert->getIssuer->toString); } $timestampDate = $token->getTimeStampInfo->getGenTime; Verifica nel nuovo formato tsdSe il file è invece nel nuovo formato tsd si fa ricorso del metodo java parseTSD:# il file è nel formato p7m TSD? my $res = $VerifyService->parseTSD($sfile); $fileP7M = "$sfile.p7m"; if(!$VerifyService->validateTSD($fileP7M)){ # nome del file contenuto nella busta, da salvare $m->out("<b>Il file $sfile non contiene un certificato .p7m marcato temporalmente (TSD).</b><br>\n"); fine(); } my $tokens = $VerifyService->tokensTSD; foreach my $token (@$tokens){ my $certificates = $token->getCertificates->getMatches(undef)->toArray; foreach my $cert (@$certificates){ $m->out('Timestamp emesso da: '.$cert->getIssuer->toString); } $timestampDate = $token->getTimeStampInfo->getGenTime; last; } $tsd = 1; Conversioni e test sulla dataPer entrambi i formati m7m e tsd viene effettuata la verifica di validità della marcatura temporale rapportata al limite temporale di validità delle firma applicate:# conversioni e test sulla data my $date_string = $timestampDate->toString; my $date_sec = str2time($date_string); my($sec,$min,$hour,$mday,$mon,$year) = localtime($date_sec); my $date_iso = sprintf('%04i-%02i-%02i %02i:%02i:%02i', 1900+$year, $mon+1, $mday, $hour, $min, $sec); $m->out(" il giorno: $date_iso<BR>\n"); if(!$tsd){ # limite di validità della data per il formato M7M my $date_limit = $r->dir_config('VerifyService_validityMPMdate'); my $date_limit_sec = str2time($date_limit); if($date_sec >= $date_limit_sec){ $m->out("<b>La data della marcatura temporale eccede il limite ($date_limit) concordato per il formato M7M</b><br>\n"); next; } } Verifica delle firme nel file firmatoSi verifica inoltre che le firme siano valide alla data della marcatura temporale:# verifica delle firme nel file firmato my $Risultati = $VerifyService->verifyP7M($fileP7M, $timestampDate); # salvataggio del file firmato $VerifyService->saveContent("$fileP7M.content"); # slurp file open SLURP, "<$fileP7M.content" || die "$! file $fileP7M.content\n"; my $let_file = do{local $/; <SLURP>}; close SLURP; # codifica del file nel formato base64 $let_file = encode_base64($let_file); # Calcola hash sul file letto my $hash = Digest::SHA1::sha1_hex($let_file, "password");Individuata l'impronta del file viene verificato che lo stesso sia presente in archivio: # Verifica se nel DB e' presente la hash calcolata $sth_archivio->execute($hash); my $file_sconosciuto = 1; while(my $archivio = $sth_archivio->fetchrow_hashref){ my $update_nuovo_file = 1; $file_sconosciuto = 0; if($archivio->{marca_temporale}){ $m->out("<B>Un file firmato è già presente in archivio con il codice $archivio->{'codice'}</B><BR>\n"); $update_nuovo_file = 0; }else{ my %lista_firme_verifica; if($sth_firme){Verifico che i soggetti firmatari coincidano con i firmatari dichiarati in archivio utilizzando il Codice Fiscale: $sth_firme->execute($hash, $hash, $hash, $hash); while(my $row = $sth_firme->fetchrow_hashref) { $lista_firme_verifica{uc $row->{codice_fiscale}} = $row; } } # lettura e confronto dei risultati foreach my $result (@{$Risultati->values->toArray}){ my $cert = $result->getCert; # class org.bouncycastle.jce.provider.X509CertificateObject my $X500str = $cert->getSubjectX500Principal->toString; # class javax.security.auth.x500.X500Principal my $Subject = SubjectX500stringToHash($X500str); $m->out("Firmato da: $X500str<BR>\n"); if(!$result->isPassed){ $m->out("<b>Test validità della firma fallito! ( range date ".$cert->getNotBefore->toString." - ".$cert->getNotAfter->toString.")</b><BR>\n"); $update_nuovo_file = 0; next; } # confronto degli attributi dei soggetti firmatari my $CF; # Codice Fiscale if($Subject->{SERIALNUMBER}){ $CF = $Subject->{SERIALNUMBER}; $CF =~ s/^IT://; }elsif($Subject->{CN}){ my @fields = split /\//, $Subject->{CN}, 4; $CF = $fields[2]; } my $firma = $lista_firme_verifica{uc $CF}; if($firma){ # firmatario presente # verifico che nome e cognome corrispondano if(uc $Subject->{GIVENNAME} ne uc $firma->{'nome'} || uc $Subject->{SURNAME} ne uc $firma->{'cognome'}){ $m->out("<b>Test nominativo non corrispondente: ( $Subject->{GIVENNAME} $Subject->{SURNAME} <> $firma->{'nome'} $firma->{'cognome'} )</b><BR>\n"); $update_nuovo_file = 0; next; } # lo tolgo dalla lista per verificare poi le firme mancanti delete $lista_firme_verifica{uc $CF}; }else{ # firmatario non previsto: lo ignoro } } # verifica firme mancanti foreach my $CF (keys %lista_firme_verifica){ $update_nuovo_file = 0; my $sogg = $lista_firme_verifica{$CF}; $m->out("<B>Manca la firma di $sogg->{nome} $sogg->{cognome} - C.F. $CF</B><BR>\n"); } } if($update_nuovo_file){ # aggiorno l'archivio con il file firmato e marcato temporalmente open FIRMATO, "<$sfile" || die "$! file $sfile\n"; my $firmato = do{local $/; <FIRMATO>}; close FIRMATO; $sth_update_archivio->execute($tsd, encode_base64($firmato), $timestampDate->toString, $hash); $dbh->commit(); $file_sconosciuto = 0; $m->out("<B>Verifica e archiviazione file firmato eseguita con successo</B> ($filename)<BR>"); } } Link:
Copyright (©)
|
<--
Deploy classi Java
mkdir -p /opt/my_application/src/java cd /opt/my_application/src/java wget http://sourceforge.net/projects/j4sign/files/verifica-firma/0.2.0/verifica-firma-0.2.0-src.zip unzip verifica-firma-0.2.0-src.zip mv verifica-firma-0.2.0-src verifica-firma-0.2.0-src-GDO
wget http://www.leader.it/pub/Blog/Uso_pratico_di_InlineJava_j4sign__Bouncy_Castle_Crypto_APIs/verifica-firma-0.2.0-src.diff cd verifica-firma-0.2.0-src-GDO # applica le modifiche ... # N.B. file generato con: diff -rupN verifica-firma-0.2.0-src verifica-firma-0.2.0-src-GDO >verifica-firma-0.2.0-src.diff patch -p1 < ../verifica-firma-0.2.0-src.diff
mkdir -p /opt/my_application/lib/java cd /opt/my_application/lib/java cp -a /opt/my_application/src/java/verifica-firma-0.2.0-src-GDO/lib/j4sign-core.jar ./ wget http://www.bouncycastle.org/download/bcmail-jdk16-146.jar wget http://www.bouncycastle.org/download/bcpg-jdk16-146.jar wget http://www.bouncycastle.org/download/bcprov-jdk16-146.jar wget http://www.bouncycastle.org/download/bctest-jdk16-146.jar wget http://www.bouncycastle.org/download/bctsp-jdk16-146.jar wget http://www.bouncycastle.org/download/
cd /opt/my_application/src/java/verifica-firma-0.2.0-src-GDO sh compila_java.shVerrà generata la classe nel file /opt/my_application/lib/java/VerifyService.jar File CA RootPer la verifica della firma è necessario fornire l'elenco delle CA accreditate al Cnipa (Ora DigitPA)mkdir -p /opt/my_application/etc/CNIPA cd /opt/my_application/etc/CNIPA wget http://www.cnipa.gov.it/site/_files/LISTACER_20101129.zip.p7m wget http://sourceforge.net/projects/j4sign/files/digitpa-certs/Certificati.zip Esempio di utilizzoFile di configurazione | |||||||||||||||||||
Deleted: | |||||||||||||||||||
< < | |||||||||||||||||||
| |||||||||||||||||||
Added: | |||||||||||||||||||
> > | # Cartella usata da Inline::Java | ||||||||||||||||||
PerlSetVar VerifyService_directory "/opt/my_application/lib/java/InlineDir" PerlSetVar VerifyService_classPath "/opt/my_application/lib/java/VerifyService.jar:/opt/my_application/lib/java/bcprov-jdk16-146.jar:/opt/my_application/lib/java/bcmail-jdk16-146.jar:/opt/my_application/lib/java/bctsp-jdk16-146.jar" PerlSetVar VerifyService_confDir "/opt/my_application/etc" # Cartella in "VerifyService_confDir" contenente i certificati PerlSetVar VerifyService_cnipaDir "CNIPA" # CA Root PerlSetVar VerifyService_cnipaCa "DigitPA.cer" # Elenco delle Root CA accreditate PerlSetVar VerifyService_cnipaRoots "LISTACER_20101129.zip.p7m" # L'impronta corrisponde a quella pubblicata nella Gazzetta Ufficiale n. 122 del 27 maggio 2010 (vedi es. http://gazzette.comune.jesi.an.it/2010/122/2.htm ) PerlSetVar VerifyService_fingerprintDigitPA "20EA4FB83593DB5C4407A538C920EBC3C5B1559C" PerlSetVar VerifyService_validityMPMdate "2011-07-01 00:00:00.000 +0200" %ENDCODE% | |||||||||||||||||||
Added: | |||||||||||||||||||
> > |
Applicazione di esempio | ||||||||||||||||||
Added: | |||||||||||||||||||
> > |
mkdir -p /opt/my_application/lib/java/InlineDir mkdir -p /opt/my_application/htdocs/_Inline
<FORM ACTION="./firma/put_firmato.html" target="_blank" name="my_file" METHOD="POST" ENCTYPE="multipart/form-data"> <SPAN ID="ArchiviazioneFileFirmato"> Path file: <input type="file" name="file_firmato" lenght=25> <INPUT TYPE="SUBMIT" VALUE="Archiviazione File Firmato"> </SPAN> </FORM> File /firma/put_firmato.html
<BR> <BLOCKQUOTE> <%flags> inherit => '/firma/put_firmato.comp' </%flags> <%perl> $m->clear_buffer; $m->call_next; </%perl> %# Nome del campo contenente il file scaricato <%method Field_filename>file_firmato</%method> %# Firme da cercare nel file firmato <%method Query_firme> select distinct cognome, nome, codice_fiscale from documenti inner join firmatari_documenti on firmatari_documenti.id_documento = documenti.id inner join anagrafiche on firmatari_documenti.id_firmatario = anagrafiche.id where documenti.hash_file = ? </%method> %# Per verificare se nel DB e' presente la hash calcolata <%method Query_archivio> select codice, marca_temporale from documenti where hash_file = ?; </%method> %# Per aggiornare l'archivio caricando il file firmato <%method Query_update_archivio> update documenti set tsd = ?, file_firmato = ?, file_originale = null, marca_temporale = ?, stato_rapporto = 'firmato' where hash_file = ?; </%method>Il file put_firmato.html fa riferimento al file put_firmato.comp nel quale sono implementate le procedure di verifica della firma File /firma/put_firmato.comp
Attivazione del servizio java per la verifica della firmaViene istanziata una Java Virtual Machine condivisa tra tutti i processi Apache:use Inline ( Java => 'STUDY', SHARED_JVM => 1, START_JVM => 0, PORT => 7893, AUTOSTUDY => 1, # DEBUG => 2, DIRECTORY => $r->dir_config('VerifyService_directory'), STUDY => ['it.trento.comune.j4sign.verification.servlet.VerifyService'], CLASSPATH => $r->dir_config('VerifyService_classPath') );
Inizializzazione della classe nella Java Virtual Machine condivisa, con i parametri di configurazioneI parametri di configurazione vengono letti dal file di configurazione di Apache.my $VerifyService = new HTML::Mason::Commands::it::trento::comune::j4sign::verification::servlet::VerifyService( $r->dir_config('VerifyService_confDir'), $r->dir_config('VerifyService_cnipaDir'), $r->dir_config('VerifyService_cnipaCa'), $r->dir_config('VerifyService_cnipaRoots'), $r->dir_config('VerifyService_fingerprintDigitPA') ); Verifica nel vecchio formato m7mA seconda dell'estensione del file scaricato viene utilizzato un diverso codice per la lettura dei file. Nel caso il formato del file sia m7m vengono estratti file firmato e pmarcatura temporale, contenuti nel file in formato MIME:#Parser file MIME my $parser = new MIME::Parser; mkdir "$tmpDir/mime_dir" || die "Errore creazione dir $tmpDir/mime_dir: $!\n"; $parser->output_dir("$tmpDir/mime_dir"); . . . . . . . . my $entity = $parser->parse_open($sfile); $fileP7M = $entity->parts(0)->{ME_Bodyhandle}->{MB_Path}; my $fileTSR = $entity->parts(1)->{ME_Bodyhandle}->{MB_Path}; if ($entity->parts != 2 || $fileP7M !~ m/\.p7m$/i || $fileTSR !~ m/\.tsr$/i) { $m->out("<b>Era atteso un file in formato MIME contenente un file .p7m e un file con estensione .tsr ($filename)</b><BR>"); fine(); } # data di applicazione della marcatura temporale (per la verifica della validità delle firme) my $token = $VerifyService->verifyTSR($fileTSR); # class org.bouncycastle.tsp.TimeStampToken # class org.bouncycastle.util.Store restituito chiamando token.getCertificates my $certificates = $token->getCertificates->getMatches(undef)->toArray; foreach my $cert (@$certificates){ # class $m->out('Timestamp emesso da: '.$cert->getIssuer->toString); } $timestampDate = $token->getTimeStampInfo->getGenTime; Verifica nel nuovo formato tsdSe il file è invece nel nuovo formato tsd si fa ricorso del metodo java parseTSD:# il file è nel formato p7m TSD? my $res = $VerifyService->parseTSD($sfile); $fileP7M = "$sfile.p7m"; if(!$VerifyService->validateTSD($fileP7M)){ # nome del file contenuto nella busta, da salvare $m->out("<b>Il file $sfile non contiene un certificato .p7m marcato temporalmente (TSD).</b><br>\n"); fine(); } my $tokens = $VerifyService->tokensTSD; foreach my $token (@$tokens){ my $certificates = $token->getCertificates->getMatches(undef)->toArray; foreach my $cert (@$certificates){ $m->out('Timestamp emesso da: '.$cert->getIssuer->toString); } $timestampDate = $token->getTimeStampInfo->getGenTime; last; } $tsd = 1; Conversioni e test sulla dataPer entrambi i formati m7m e tsd viene effettuata la verifica di validità della marcatura temporale rapportata al limite temporale di validità delle firma applicate:# conversioni e test sulla data my $date_string = $timestampDate->toString; my $date_sec = str2time($date_string); my($sec,$min,$hour,$mday,$mon,$year) = localtime($date_sec); my $date_iso = sprintf('%04i-%02i-%02i %02i:%02i:%02i', 1900+$year, $mon+1, $mday, $hour, $min, $sec); $m->out(" il giorno: $date_iso<BR>\n"); if(!$tsd){ # limite di validità della data per il formato M7M my $date_limit = $r->dir_config('VerifyService_validityMPMdate'); my $date_limit_sec = str2time($date_limit); if($date_sec >= $date_limit_sec){ $m->out("<b>La data della marcatura temporale eccede il limite ($date_limit) concordato per il formato M7M</b><br>\n"); next; } } Verifica delle firme nel file firmatoSi verifica inoltre che le firme siano valide alla data della marcatura temporale:# verifica delle firme nel file firmato my $Risultati = $VerifyService->verifyP7M($fileP7M, $timestampDate); # salvataggio del file firmato $VerifyService->saveContent("$fileP7M.content"); # slurp file open SLURP, "<$fileP7M.content" || die "$! file $fileP7M.content\n"; my $let_file = do{local $/; <SLURP>}; close SLURP; # codifica del file nel formato base64 $let_file = encode_base64($let_file); # Calcola hash sul file letto my $hash = Digest::SHA1::sha1_hex($let_file, "password");Individuata l'impronta del file viene verificato che lo stesso sia presente in archivio: # Verifica se nel DB e' presente la hash calcolata $sth_archivio->execute($hash); my $file_sconosciuto = 1; while(my $archivio = $sth_archivio->fetchrow_hashref){ my $update_nuovo_file = 1; $file_sconosciuto = 0; if($archivio->{marca_temporale}){ $m->out("<B>Un file firmato è già presente in archivio con il codice $archivio->{'codice'}</B><BR>\n"); $update_nuovo_file = 0; }else{ my %lista_firme_verifica; if($sth_firme){Verifico che i soggetti firmatari coincidano con i firmatari dichiarati in archivio utilizzando il Codice Fiscale: $sth_firme->execute($hash, $hash, $hash, $hash); while(my $row = $sth_firme->fetchrow_hashref) { $lista_firme_verifica{uc $row->{codice_fiscale}} = $row; } } # lettura e confronto dei risultati foreach my $result (@{$Risultati->values->toArray}){ my $cert = $result->getCert; # class org.bouncycastle.jce.provider.X509CertificateObject my $X500str = $cert->getSubjectX500Principal->toString; # class javax.security.auth.x500.X500Principal my $Subject = SubjectX500stringToHash($X500str); $m->out("Firmato da: $X500str<BR>\n"); if(!$result->isPassed){ $m->out("<b>Test validità della firma fallito! ( range date ".$cert->getNotBefore->toString." - ".$cert->getNotAfter->toString.")</b><BR>\n"); $update_nuovo_file = 0; next; } # confronto degli attributi dei soggetti firmatari my $CF; # Codice Fiscale if($Subject->{SERIALNUMBER}){ $CF = $Subject->{SERIALNUMBER}; $CF =~ s/^IT://; }elsif($Subject->{CN}){ my @fields = split /\//, $Subject->{CN}, 4; $CF = $fields[2]; } my $firma = $lista_firme_verifica{uc $CF}; if($firma){ # firmatario presente # verifico che nome e cognome corrispondano if(uc $Subject->{GIVENNAME} ne uc $firma->{'nome'} || uc $Subject->{SURNAME} ne uc $firma->{'cognome'}){ $m->out("<b>Test nominativo non corrispondente: ( $Subject->{GIVENNAME} $Subject->{SURNAME} <> $firma->{'nome'} $firma->{'cognome'} )</b><BR>\n"); $update_nuovo_file = 0; next; } # lo tolgo dalla lista per verificare poi le firme mancanti delete $lista_firme_verifica{uc $CF}; }else{ # firmatario non previsto: lo ignoro } } # verifica firme mancanti foreach my $CF (keys %lista_firme_verifica){ $update_nuovo_file = 0; my $sogg = $lista_firme_verifica{$CF}; $m->out("<B>Manca la firma di $sogg->{nome} $sogg->{cognome} - C.F. $CF</B><BR>\n"); } } if($update_nuovo_file){ # aggiorno l'archivio con il file firmato e marcato temporalmente open FIRMATO, "<$sfile" || die "$! file $sfile\n"; my $firmato = do{local $/; <FIRMATO>}; close FIRMATO; $sth_update_archivio->execute($tsd, encode_base64($firmato), $timestampDate->toString, $hash); $dbh->commit(); $file_sconosciuto = 0; $m->out("<B>Verifica e archiviazione file firmato eseguita con successo</B> ($filename)<BR>"); } } | ||||||||||||||||||
Link:
Copyright (©)
| |||||||||||||||||||
Added: | |||||||||||||||||||
> > | |||||||||||||||||||
| |||||||||||||||||||
Added: | |||||||||||||||||||
> > |
| ||||||||||||||||||
|