9

ruby を使用して 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>
4

3 に答える 3

8

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

現在、この gem を積極的に使用しているため、バグは比較的迅速に修正されるはずです。

https://rubygems.org/gems/xmldsig

于 2013-01-23T13:12:59.657 に答える
2

残念ながら、XML 署名の作成と検証は非常に複雑です。詳細は仕様に記載されています。しばらく前に stdlib への追加として提案するために実装を開始しましたが、別のプロジェクトがより重要になり、Nokogiri が私が必要とし、残念ながら libxml を直接使用してすでに実装していた Canonicalization 機能を提供し始めたため、停止しました。そこを見て必要なものを確認し、そのアイデアを単純な Nokogiri コードに移植することをお勧めします。

それらを使用すると、Ruby で XML-DSIG を完全に実装できるはずです。しかし、準備をしてください。それは簡単なことではありません。あなたを夢中にさせる大きな可能性を秘めた多くの小さな詳細があります...

JRuby に切り替えて、Java 標準ライブラリーに同梱されている XML-DSIGのデフォルトの実装を統合する方がよいかもしれません。

于 2012-11-17T14:59:06.260 に答える
1

これは署名/ダイジェストに使用できるgemですが、正規化にはまだ問題があり、おそらくそれが適切なダイジェストを取得できない理由です: https://github.com/ebeigarts/signer

于 2013-11-08T13:38:34.683 に答える