13

Rails アプリケーション サーバーを使用して、既存の PDF ファイルにデジタル署名を挿入する必要があります。(基本的に、クライアントは pdf ファイルをアップロードし、サーバーはそれらにローカル証明書で署名します)

私はJSignpdfを使用してPDFファイルにデジタル署名を挿入し、ルビーの宝石を探し始めました...

rubypdfサイトhttp://soft.rubypdf.com/software/pdf-digital-signeでこの仕事をするための別のポータブルファイルを見つけましたが、ルビーでこれを行うためのgemやサンプルコードさえ見つかりません。

OpenSSL を使用したデジタル署名の検証も見ましたが、ローカル証明書ファイルを使用して、既存のドキュメントに実際に署名する方法を理解できませんでした。

http://code.google.com/p/origami-pdf/でもピークを迎えましたが、これはおそらく「単純な」(少なくとも概念的には) タスクには少し厳しいようです。

アイデア/提案はありますか?

ありがとうございました

4

2 に答える 2

16

いくつかの調査の後、OpenSSL ドキュメントに戻り、Origami ソリューションを調査した後、以下のコードを作成し、ローカルで生成された署名/証明書を PDF ドキュメントに挿入することができました。ここで、これを外部で生成された証明書で使用する方法を理解する必要があります(以下のバージョン2を確認してください。解決した場所です)。OpenSSL およびDER でエンコードされた証明書で発生した問題の詳細を確認できる新しい質問を開きました。

バージョン 2 を開発するために、ドキュメントに新しいページを追加せずに、署名を Adob​​e Reader で表示できるように、注釈を追加する方法についても考えました。origami documentationから、これに関する私の最後の問題を解決した get_page メソッドを見つけました。記録のために、私はAdobe Reader Xを使用しています。

これが私と同じように役立つことを願っています;-)。

バージョン 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)

バージョン 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)
于 2012-08-29T11:05:26.847 に答える
-2

有料のプロジェクトに取り組んでいる場合は、開発者が PDF ドキュメントにデジタル署名し、PDF ドキュメントのセキュリティ設定を変更するために構築された商用 Java ライブラリであるjPDFSecureを検討することをお勧めします。jPDFSecure を使用すると、アプリケーションまたは Java アプレットで PDF ドキュメントを暗号化し、権限とパスワードを設定し、デジタル署名を作成して適用できます。jPDFSecure はパフォーマンスが最適化されており、Qoppa 独自の PDF 技術の上に構築されているため、サードパーティのソフトウェアやドライバーは必要ありません。

jPDFSecure には、ファイル、ネットワーク ドライブ、URL、さらには入力ストリームから PDF ドキュメントをロードするためのシンプルなインターフェイスがあり、実行時に生成されるか、データベースから直接取得されます。セキュリティ設定を変更した後、jPDFSecure は、Java EE アプリケーション サーバーで実行されている場合、ドキュメントをファイル、java.io.OutputStream または javax.servlet.ServletOutputStream に保存して、ファイルをブラウザに直接出力できます。

jPDFSecure はプラットフォームに依存せず、Windows、Mac OSX、Linux など、Java をサポートするあらゆる環境で使用できます。

于 2012-08-23T03:02:42.407 に答える