2012-10-29 28 views
9

ルビーを使ってxmlに署名する必要があります。誰かがそのためのメソッドやlibを知っていますか?ルビーでxml署名を行う方法

私のxml骨格は次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Message> 
    <MessageId> 
     <ServiceId>service</ServiceId> 
     <Version>1.0</Version> 
     <MsgDesc>Service Description</MsgDesc> 
     <Code>4</Code> 
     <FromAddress>from</FromAddress> 
     <ToAddress>to</ToAddress> 
     <Date>2012-10-29</Date> 
    </MessageId> 
    <MessageBody/> 

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
    <Reference URI=""> 
    <Transforms> 
     <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
    </Transforms> 
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
    <DigestValue>??????</DigestValue> 
    </Reference> 
    </SignedInfo> 

    <SignatureValue>????????????</SignatureValue> 
    <KeyInfo> 
    <X509Data> 
     <X509Certificate>????????</X509Certificate> 
    </X509Data> 
    </KeyInfo> 
</Signature> 
</message> 

私はDigestValueのためにこのコードを試してみましたが、私はJavaの例と比較すること、それをテストしましたが、DigestValueは私のJavaの例の応答と一致していません。

require 'base64' 
require 'openssl' 

to_sign_xml = File.read 'service.xml' 
digest = OpenSSL::Digest::SHA1.digest(to_sign_xml) 

digest = Base64.encode64(digest.to_s).gsub(/\n/, '') 
raise digest.inspect 

マイファイルservice.xmlには含まれている:

<Message> 
    <MessageId> 
     <ServiceId>service</ServiceId> 
     <Version>1.0</Version> 
     <MsgDesc>Service Description</MsgDesc> 
     <Code>4</Code> 
     <FromAddress>from</FromAddress> 
     <ToAddress>to</ToAddress> 
     <Date>2012-10-29</Date> 
    </MessageId> 
    <MessageBody/> 
<Message> 
+2

あなたが取ることを見ていませんアカウントの正規化、cf.あなたの場合はhttp://www.w3.org/TR/xml-exc-c14n/。 – mkl

+3

私は、あなたが入ろうとしている痛みの世界について事前にお詫び申し上げます。=関連するこの質問を参照してください:http://stackoverflow.com/questions/3038757/canonicalizing-xml-in-ruby – maerics

答えて

6

まだ興味があれば、私はこの宝石を1週間前に作った。それはまだ開発中ですが、基本的なものが実装されています。この宝石は、xmlsecライブラリで作成された署名に対してテストされます。 http://www.aleksey.com/xmlsec/

私は現時点でこの宝石に積極的に取り組んでおり、バグは比較的早く修正する必要があります。ここで

https://rubygems.org/gems/xmldsig

2

残念ながら、XML秒点火の作成と検証は非常に複雑です。詳細はspecにあります。私はstdlib some time agoの追加として提案するように実装を開始しましたが、別のプロジェクトが重要になり、Nokogiriが残念ながらlibxmlを直接使用して実装したCanonicalization機能を提供し始めたため停止しました。必要なものを見てから、ノコギリコードにアイデアを移植することができます。

これらを使用すると、RubyでXML-DSIGを完全に実装できるはずです。しかし、準備することは簡単なことではありません。たくさんの細かい細部があり、あなたにナッツをぶつける可能性があります。

JRubyに切り替えて、XMLのdefault implementation Java標準ライブラリに付属する-DSIG。

1

しかし、私はまだ標準化といくつかの問題を抱えていると私は、適切なダイジェストを取得しない理由は、おそらくそれはだ、署名/消化するために使用可能な逸品です:https://github.com/ebeigarts/signer

関連する問題