Inserisci la firma digitale nel file pdf esistente

Ho bisogno di inserire una firma digitale in file pdf già esistenti, utilizzando un server di applicazioni rails. (In pratica, i client caricano file PDF e il server li firma con un certificato locale)

Ho usato JSignpdf per inserire firme digitali in file PDF e ho iniziato a cercare gemme per ruby ​​…

Ho trovato un altro file portatile per fare questo lavoro sul sito rubypdf http://soft.rubypdf.com/software/pdf-digital-signe , ma non riesco a trovare alcun gioiello o codice di esempio per farlo in ruby.

Ho esaminato anche la verifica della firma digitale con OpenSSL , ma non sono riuscito a capire come firmare effettivamente un documento già esistente, con un file di certificato locale.

Ho anche preso un picco a http://code.google.com/p/origami-pdf/ , ma questo sembra un po ‘duro per un compito supposto “semplice” (almeno in termini di concetto).

Qualche idea / suggerimento?

Grazie

Dopo alcune ricerche, ricorrendo alla documentazione di OpenSSL e esplorando la soluzione Origami , ho creato il codice seguente e sono riuscito a inserire una firma / certificato generato localmente in un documento PDF. Ora ho solo bisogno di capire come usare questo con un certificato generato esterno (controlla la versione 2 qui sotto, dove ho risolto). Ho aperto una nuova domanda in cui è ansible trovare alcuni dettagli su una difficoltà che ho avuto con OpenSSL e certificati codificati DER .

Per sviluppare la versione 2, ho anche dedicato del tempo a chiedermi come aggiungere un’annotazione, in modo che la firma diventi visibile nel lettore Adobe, senza aggiungere una nuova pagina al documento. Dalla documentazione di origami , ho trovato il metodo get_page, che ha risolto il mio ultimo problema su questo. Sto usando Adobe Reader X, per la cronaca.

Spero che tu trovi questo utile come lo farò ;-).

VERSIONE 1 – Genera certificato e file chiave e inseriscili direttamente nel documento

require 'openssl' begin require 'origami' rescue LoadError ORIGAMIDIR = "C:\RailsInstaller\Ruby1.9.3\lib\ruby\gems\1.9.1\gems\origami-1.2.4\lib" $: << ORIGAMIDIR require 'origami' end include Origami # Code below is based on documentation available on # http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL.html key = OpenSSL::PKey::RSA.new 2048 open 'private_key.pem', 'w' do |io| io.write key.to_pem end open 'public_key.pem', 'w' do |io| io.write key.public_key.to_pem end cipher = OpenSSL::Cipher::Cipher.new 'AES-128-CBC' pass_phrase = 'Origami rocks' key_secure = key.export cipher, pass_phrase open 'private_key.pem', 'w' do |io| io.write key_secure end #Create the certificate name = OpenSSL::X509::Name.parse 'CN=nobody/DC=example' cert = OpenSSL::X509::Certificate.new cert.version = 2 cert.serial = 0 cert.not_before = Time.now cert.not_after = Time.now + 3600 cert.public_key = key.public_key cert.subject = name OUTPUTFILE = "test.pdf" contents = ContentStream.new.setFilter(:FlateDecode) contents.write OUTPUTFILE, :x => 350, :y => 750, :rendering => Text::Rendering::STROKE, :size => 30 pdf = PDF.read('Sample.pdf') # Open certificate files #sigannot = Annotation::Widget::Signature.new #sigannot.Rect = Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0] #page.add_annot(sigannot) # Sign the PDF with the specified keys pdf.sign(cert, key, :method => 'adbe.pkcs7.sha1', #:annotation => sigannot, :location => "Portugal", :contact => "[email protected]", :reason => "Proof of Concept" ) # Save the resulting file pdf.save(OUTPUTFILE) 

VERSIONE 2 – Utilizzare i certificati esistenti per firmare un documento PDF

 require 'openssl' begin require 'origami' rescue LoadError ORIGAMIDIR = "C:\RailsInstaller\Ruby1.9.3\lib\ruby\gems\1.9.1\gems\origami-1.2.4\lib" $: << ORIGAMIDIR require 'origami' end include Origami INPUTFILE = "Sample.pdf" @inputfile = String.new(INPUTFILE) OUTPUTFILE = @inputfile.insert(INPUTFILE.rindex("."),"_signed") CERTFILE = "certificate.pem" RSAKEYFILE = "private_key.pem" passphrase = "your passphrase" key4pem=File.read RSAKEYFILE key = OpenSSL::PKey::RSA.new key4pem, passphrase cert = OpenSSL::X509::Certificate.new(File.read CERTFILE) pdf = PDF.read(INPUTFILE) page = pdf.get_page(1) # Add signature annotation (so it becomes visibles in pdf document) sigannot = Annotation::Widget::Signature.new sigannot.Rect = Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0] page.add_annot(sigannot) # Sign the PDF with the specified keys pdf.sign(cert, key, :method => 'adbe.pkcs7.sha1', :annotation => sigannot, :location => "Portugal", :contact => "[email protected]", :reason => "Proof of Concept" ) # Save the resulting file pdf.save(OUTPUTFILE) 

Se stai lavorando a un progetto di pagamento, potresti prendere in considerazione jPDFSecure , una libreria Java commerciale creata per gli sviluppatori per firmare digitalmente i documenti PDF e modificare le impostazioni di sicurezza sui documenti PDF. Con jPDFSecure, l’applicazione o l’applet java possono crittografare documenti PDF, impostare permessi e password e creare e applicare firme digitali. jPDFSecure è ottimizzato per le prestazioni e si basa sulla tecnologia PDF proprietaria di Qoppa, quindi non è necessario alcun software o driver di terze parti.

jPDFSecure ha un’interfaccia semplice per caricare documenti PDF da file, unità di rete, URL e persino flussi di input, che possono essere generati in runtime o provenire direttamente da un database. Dopo aver modificato le impostazioni di sicurezza, jPDFSecure può salvare il documento in un file, un java.io.OutputStream o un javax.servlet.ServletOutputStream quando è in esecuzione in un server delle applicazioni Java EE per inviare il file direttamente a un browser.

jPDFSecure è indipendente dalla piattaforma e può essere utilizzato in qualsiasi ambiente che supporti Java, inclusi Windows, Mac OSX e Linux.