插入数字签名到现有的PDF文件(Insert digital signature into exis

2019-06-27 06:48发布

我需要插入一个数字签名到现有的PDF文件,使用Rails应用服务器。 (基本上,客户端上传PDF文件和服务器与本地标志证书它们)

我一直在使用JSignpdf插入数字签名转换成PDF文件,并开始探查的宝石红宝石...

我发现另一个便携式文件上做rubypdf网站这项工作http://soft.rubypdf.com/software/pdf-digital-signe ,但找不到任何宝石,甚至示例代码在Ruby中做到这一点。

我也看了一下OpenSSL的数字签名验证 ,但不明白如何实际签署一个已经存在的文件,与当地的证书文件。

我也参加了在高峰http://code.google.com/p/origami-pdf/ ,但这似乎有点苛刻了supposingly“简单”(至少在概念上)任务。

任何意见/建议吗?

谢谢

Answer 1:

经过一番研究,反复出现的OpenSSL文档和探索折纸的解决方案 ,我建立了下面的代码,并成功地插入本地生成的签名/证书到一个PDF文档。 现在我只需要弄清楚如何与外部生成的证书使用(检查版本2所示,其中我解决了这个问题)。 我已经打开了新的问题,在这里你可以找到一个难点就是曾与OpenSSL和一些细节DER编码证书。

为了开发第2版,我也花了一些时间琢磨如何添加注释 - 所以签名在Adobe Reader变得可见 - 而无需添加新的页面文件。 从折纸的文档 ,我发现get_page方法,该方法解决了这个我最后一个问题。 我使用的Adobe Reader X,备案。

希望对您有所帮助,我会;-)。

VERSION 1 -生成证书和密钥文件,并将它们直接插入到文档中

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)

VERSION 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)


Answer 2:

如果你对薪酬的一个项目工作,你可能要考虑jPDFSecure ,为开发者数字签名PDF文档和PDF文档更改安全设置建一个商业的Java库。 随着jPDFSecure,您的应用程序或Java小程序可以加密的PDF文件,设置权限和密码,以及创建和使用数字签名。 jPDFSecure针对性能进行了优化,是建立在Qoppa专有PDF技术之上所以不需要任何第三方软件或驱动程序。

jPDFSecure有一个简单的接口,以从文件加载,网络驱动器,网址和甚至输入流,其可以被生成的运行或直接从一个数据库来的PDF文档。 更改安全设置后,jPDFSecure可以在Java EE应用服务器直接运行到输出文件的浏览器时的文件保存到一个文件,一个java.io.OutputStream中或一个javax.servlet.ServletOutputStream。

jPDFSecure是独立于平台,并且可以在任何支持Java,包括Windows,Mac OSX和Linux的任何环境中使用。



文章来源: Insert digital signature into existing pdf file