Inserir assinatura digital no arquivo PDF existente

Eu preciso inserir uma assinatura digital em arquivos PDF já existentes, usando um servidor de aplicativos Rails. (Basicamente, os clientes fazem upload de arquivos pdf e o servidor os assina com um certificado local)

Eu tenho usado JSignpdf para inserir assinaturas digitais em arquivos pdf, e comecei a sondar por gemas para ruby ​​…

Eu encontrei outro arquivo portátil para fazer este trabalho no site do Rubypdf http://soft.rubypdf.com/software/pdf-digital-signe , mas não consigo encontrar qualquer gem ou mesmo código de exemplo para fazer isso em Ruby.

Examinei também a verificação de assinatura digital com o OpenSSL , mas não consegui entender como realmente assinar um documento já existente, com um arquivo de certificado local.

Eu também tive um pico em http://code.google.com/p/origami-pdf/ , mas isso parece um pouco duro para uma tarefa supostamente “simples” (pelo menos em conceito).

Alguma idéia / sugestão?

Obrigado

Após algumas pesquisas, recorrendo à documentação do OpenSSL e explorando a solução Origami , construí o código abaixo e consegui inserir uma assinatura / certificado gerado localmente em um documento pdf. Agora eu só preciso descobrir como usar isso com um certificado gerado externo (verifique a versão 2 abaixo, onde eu resolvi isso). Eu abri uma nova pergunta onde você pode encontrar alguns detalhes sobre uma dificuldade que tive com certificados codificados OpenSSL e DER .

Para desenvolver a versão 2, também passei algum tempo imaginando como adicionar uma anotação – para que a assinatura se torne visível no Adobe Reader – sem adicionar uma nova página ao documento. Da documentação do origami , encontrei o método get_page, que resolveu meu último problema sobre isso. Estou usando o Adobe Reader X, para o registro.

Espero que você ache isso útil como eu vou ;-).

VERSÃO 1 – Gerar certificado e arquivo de chave e inseri-los diretamente no 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 => "myemail@email.tt", :reason => "Proof of Concept" ) # Save the resulting file pdf.save(OUTPUTFILE) 

VERSÃO 2 – Use certificados existentes para assinar um 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 => "myemail@email.tt", :reason => "Proof of Concept" ) # Save the resulting file pdf.save(OUTPUTFILE) 

Se você estiver trabalhando em um projeto para pagamento, talvez queira considerar o jPDFSecure , uma biblioteca Java comercial criada para que os desenvolvedores assinem digitalmente documentos PDF e alterem as configurações de segurança em documentos PDF. Com o jPDFSecure, seu aplicativo ou applet java pode criptografar documentos PDF, definir permissions e senhas e criar e aplicar assinaturas digitais. O jPDFSecure é otimizado para desempenho e é construído sobre a tecnologia PDF proprietária da Qoppa, portanto, não há necessidade de nenhum software ou driver de terceiros.

O jPDFSecure possui uma interface simples para carregar documentos PDF de arquivos, unidades de rede, URLs e até streams de input, que podem ser gerados em tempo de execução ou diretamente de um database. Depois de alterar as configurações de segurança, o jPDFSecure pode salvar o documento em um arquivo, um java.io.OutputStream ou um javax.servlet.ServletOutputStream quando executado em um servidor de aplicativos Java EE para enviar o arquivo diretamente para um navegador.

O jPDFSecure é independente de plataforma e pode ser usado em qualquer ambiente que suporte Java, incluindo Windows, Mac OSX e Linux.

    Intereting Posts