gpt4 book ai didi

ruby - 将数字签名插入现有的 pdf 文件

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:11 26 4
gpt4 key购买 nike

我需要使用 Rails 应用程序服务器将数字签名插入到现有的 pdf 文件中。 (基本上,客户端上传pdf文件,服务器用本地证书签名)

我一直在使用 JSignpdf 将数字签名插入 pdf 文件,并开始探索 ruby​​ 的 gems...

我在 ruby​​pdf 网站上找到了另一个可移植文件来完成这项工作 http://soft.rubypdf.com/software/pdf-digital-signe ,但在 ruby​​ 中找不到任何 gem 甚至示例代码来执行此操作。

我也看过 Digital signature verification with OpenSSL ,但无法理解如何使用本地证书文件对现有文档进行实际签名。

我也在http://code.google.com/p/origami-pdf/上了一个峰,但这对于假定的“简单”(至少在概念上)任务来说似乎有点苛刻。

有什么想法/建议吗?

谢谢

最佳答案

经过一些研究,重复到 OpenSSL documentation并探索 Origami solution ,我构建了下面的代码,并设法将本地生成的签名/证书插入到 pdf 文档中。现在我只需要弄清楚如何将它与外部生成的证书一起使用(检查下面的版本 2,我在那里解决了它)。我开了一个新的question您可以在其中找到有关我在使用 OpenSSL 和 DER encoded 时遇到的困难的一些详细信息证书。

为了开发第 2 版,我还花了一些时间想知道如何在不向文档添加新页面的情况下添加注释 - 因此签名在 Adob​​e Reader 中可见。来自 origami documentation ,我找到了 get_page 方法,它解决了我最后一个关于这个的问题。为了记录,我使用的是 Adob​​e Reader X。

希望您和我一样觉得这很有用 ;-)。

版本 1 - 生成证书和 key 文件,并将它们直接插入到文档中

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)

版本 2 - 使用现有证书签署 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)

关于ruby - 将数字签名插入现有的 pdf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com