2012-08-22 17 views
11

Ich muss eine digitale Signatur in bereits vorhandene PDF-Dateien einfügen, indem ich einen Rails-Anwendungsserver verwende. (Grundsätzlich Clients PDF-Dateien laden und der Server signiert sie mit einem lokalen Zertifikat)Digitale Signatur in vorhandene PDF-Datei einfügen

Ich habe JSignPdf wurde unter Verwendung von digitalen Signaturen in PDF-Dateien eingefügt werden, und begann für Edelsteine ​​für Rubin Sondieren ...

I habe eine andere portable Datei gefunden, um diese Aufgabe auf der Rubypdf-Site http://soft.rubypdf.com/software/pdf-digital-signe zu erledigen, kann aber kein Juwel oder sogar einen Beispielcode finden, um dies in Ruby zu tun.

Ich habe mir auch Digital signature verification with OpenSSL angesehen, konnte aber nicht verstehen, wie man ein bereits bestehendes Dokument mit einer lokalen Zertifikatsdatei tatsächlich signiert.

Ich nahm auch einen Höhepunkt bei http://code.google.com/p/origami-pdf/, aber das scheint ein bisschen hart für eine angeblich "einfache" (zumindest im Konzept) Aufgabe.

Irgendwelche Ideen/Vorschläge?

Danke

+1

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. –

+0

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

+0

@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

Antwort

11

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) 
+0

Ich habe ähnliche Anforderungen, aber ich verwende Java. Ich denke jSignPDF oder jPDFSecure sollte tun. Ich würde gerne wissen, welche Bibliothek Sie verwendet haben, um digitale Signatur/Zertifikat zu PDF hinzuzufügen? – tarekahf

+0

@MrWater das gibt mir 'method_missing ': Keine Methode' add_annot' für Origami :: Page (NoMethodError). Hast du einen Hinweis, was der Grund für den Fehler sein könnte? – ManuKaracho

+1

@tarekahf nur jetzt sah ich das. Wenn ich mich erinnere (das war im Jahr 2012), habe ich Jsignpdf App, nicht lib, also kann ich nicht direkt antworten. Vielleicht sollten Sie versuchen zu überprüfen, wie Sie die Befehlszeile mit 'java -jar JSignPdf.jar --help' verwenden, wie in http://jsignpdf.sourceforge.net/ angegeben und vielleicht rufen Sie die Befehlszeile von Ihrer App aus? – MrWater

-2

Wenn Sie an einem Projekt für Bezahlung arbeiten, möchten Sie vielleicht jPDFSecure, eine kommerzielle Java-Bibliothek für Entwickler gebaut prüfen, um PDF-Dokumente digital signieren und Sicherheitseinstellungen für PDF-Dokumente zu ändern. Mit jPDFSecure kann Ihre Anwendung oder Ihr Java-Applet PDF-Dokumente verschlüsseln, Berechtigungen und Kennwörter festlegen sowie digitale Signaturen erstellen und anwenden. jPDFSecure ist auf Leistung optimiert und basiert auf der proprietären PDF-Technologie von Qoppa, so dass keine Software oder Treiber von Drittanbietern benötigt werden.

jPDFSecure hat eine einfache Schnittstelle zum Laden von PDF-Dokumenten aus Dateien, Netzlaufwerken, URLs und sogar Eingabestreams, die zur Laufzeit generiert werden können oder direkt aus einer Datenbank kommen. Nachdem die Sicherheitseinstellungen geändert wurden, kann jPDFSecure das Dokument in einer Datei, einem java.io.OutputStream oder einem javax.servlet.ServletOutputStream speichern, wenn es auf einem Java EE-Anwendungsserver ausgeführt wird, um die Datei direkt an einen Browser auszugeben.

jPDFSecure ist plattformunabhängig und kann in jeder Umgebung verwendet werden, die Java unterstützt, einschließlich Windows, Mac OSX und Linux.

+1

Und wie würde ich das mit Rubin integrieren? Warum wäre jPDFSecure besser als jSignpdf? – MrWater

Verwandte Themen