Вставить цифровую подпись в существующий файл pdf
Мне нужно вставить цифровую подпись в уже существующие pdf-файлы, используя сервер приложений rails. (В основном клиенты загружают pdf-файлы, а сервер подписывает их локальным сертификатом)
Я использовал JSignpdf для вставки цифровых подписей в pdf-файлы и начал искать драгоценные камни для ruby...
Я нашел другой портативный файл для выполнения этой работы на сайте rubypdf http://soft.rubypdf.com/software/pdf-digital-signe, но не может найти любой драгоценный камень или даже пример кода для этого в ruby.
Я тоже смотрел на проверка цифровой подписи с OpenSSL, но не мог понять, как на самом деле подписать уже существующий документ, с локальным файлом сертификата.
Я также взял пик на http://code.google.com/p/origami-pdf/, но это кажется немного суровым для предположительно "простой" (по крайней мере, в концепции) задачи.
любые идеи/предложения?
спасибо вы
2 ответов
после некоторых исследований, повторяющихся в документация OpenSSL и знакомства оригами решением, Я построил код ниже и сумел вставить локально сгенерированную подпись/сертификат в pdf-документ. Теперь мне просто нужно выяснить, как использовать это с внешним сгенерированным сертификатом (проверьте версию 2 ниже, где я ее решил). Я открыл новый вопрос где вы можете найти некоторые подробности о трудностях, которые у меня были с OpenSSL и DER encoded сертификаты.
чтобы разработать версию 2, я также потратил некоторое время, задаваясь вопросом, Как добавить аннотацию - чтобы подпись стала видимой в Adobe reader - без добавления новой страницы в документ. От оригами документации, Я нашел метод get_page, который решил мою последнюю проблему на этом. Я использую Adobe Reader X для записи.
надеюсь, вы найдете это полезным, как и я; -).
Версия 1-генерация сертификат и ключевой файл, и вставьте их непосредственно в документ
require 'openssl'
begin
require 'origami'
rescue LoadError
ORIGAMIDIR = "C:\RailsInstaller\Ruby1.9.3\lib\ruby\gems.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)
версия 2-используйте существующие сертификаты для подписания pdf-документа
require 'openssl'
begin
require 'origami'
rescue LoadError
ORIGAMIDIR = "C:\RailsInstaller\Ruby1.9.3\lib\ruby\gems.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)
Если вы работаете над проектом за плату, вы можете рассмотреть jPDFSecure, коммерческая библиотека Java, построенная для разработчиков для цифровой подписи PDF-документов и изменения параметров безопасности в PDF-документах. С помощью jPDFSecure ваше приложение или Java-апплет могут шифровать PDF-документы, устанавливать разрешения и пароли, а также создавать и применять цифровые подписи. jPDFSecure оптимизирован для производительности и построен поверх запатентованной технологии PDF Qoppa, поэтому нет необходимости для любого стороннего программного обеспечения или драйверов.
jPDFSecure имеет простой интерфейс для загрузки PDF-документов из файлов, сетевых дисков, URL-адресов и даже входных потоков, которые могут быть созданы во время выполнения или поступать непосредственно из базы данных. После изменения параметров безопасности jPDFSecure может сохранить документ в файл java.Ио.OutputStream или javax.сервлет.ServletOutputStream при запуске на сервере приложений Java EE для вывода файла непосредственно в браузер.
jPDFSecure является платформа независима и может использоваться в любой среде, поддерживающей Java, включая Windows, Mac OSX и Linux.