Nach einigen Recherchen, wiederkehrend zu der OpenSSL documentation und Erkundung der Origami solution, baute ich den folgenden Code, und schaffte es, eine lokal generierte Signatur/Zertifikat in ein PDF-Dokument einzufügen. Jetzt muss ich nur herausfinden, wie man das mit einem extern generierten Zertifikat benutzt (überprüfe Version 2 unten, wo ich es gelöst habe). Ich habe eine neue question geöffnet, wo Sie einige Details zu einer Schwierigkeit finden, die ich mit OpenSSL und DER encoded Zertifikate hatte.
Um Version 2 zu entwickeln, habe ich mich auch gefragt, wie man eine Annotation hinzufügt - so dass die Signatur im Adobe Reader sichtbar wird - ohne dem Dokument eine neue Seite hinzuzufügen. Von origami documentation habe ich die Methode get_page gefunden, die mein letztes Problem gelöst hat. Ich benutze Adobe Reader X, für die Aufzeichnung.
Hoffe, du findest das nützlich, wie ich will ;-).
VERSION 1 - Generieren Zertifikat und die Schlüsseldatei, und fügen Sie sie direkt in das Dokument
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)
VERSION 2 - Verwenden Sie Zertifikate bestehenden PDF-Dokument
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)
die Aufgabe zu unterzeichnen ist nur "angenommen" einfach, hat aber viele Vorbehalte und Komplexitäten auf allen Ebenen. Das ist einer der Gründe, warum Sie nichts finden können - ich bezweifle, dass man erhebliche Anstrengungen unternehmen würde, um einen PDF-Unterzeichner in Industriequalität für Ruby zu entwickeln. Ich würde ein paar gute Komponenten für .NET/Mono vorschlagen, wenn Sie externe Klassen in irgendeiner Weise aufrufen können. –
Hey @ EugeneMayevski'EldoSCorp, ich denke, SOGEI hat es mit Origami gemacht, und jetzt habe ich es hier hingelegt, nachdem ich die Bereiche Origami und OpenSSL ein wenig erforscht habe. Genießen. – MrWater
@MrWater: Könnten Sie bitte einen Beispielcode bereitstellen, der zeigt, wie Sie mit jSignPDF digitale Signaturen zu Ihrem PDF mit Java hinzufügen können? – tarekahf