2012-10-29 45 views
9

Tôi cần phải ký xml bằng ruby, ai đó biết bất kỳ phương pháp hay lib nào cho điều đó?Làm thế nào để ký xml trong ruby ​​

xml bộ xương của tôi là:

<?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> 

Tôi đã thử mã này cho DigestValue và tôi đã thử nghiệm nó, so sánh nó với ví dụ java của tôi, nhưng DigestValue không phù hợp với phản ứng của ví dụ java của tôi:

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 

tập tin service.xml My chứa rằng:

<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

Bạn không nhìn thấy để có vào tài khoản chuẩn hóa, cf. http://www.w3.org/TR/xml-exc-c14n/ trong trường hợp của bạn. – mkl

+3

Tôi xin lỗi trước vì thế giới của nỗi đau bạn sắp nhập =) Xem câu hỏi liên quan này: http://stackoverflow.com/questions/3038757/canonicalizing-xml-in-ruby – maerics

Trả lời

6

Nếu bạn vẫn quan tâm, tôi đã tạo đá quý này cách đây một tuần. Nó vẫn đang được phát triển nhưng những thứ cơ bản được thực hiện. Đá quý này được thử nghiệm với các chữ ký được tạo bằng thư viện xmlsec. http://www.aleksey.com/xmlsec/

Tôi đang tích cực làm việc với đá quý này vào lúc này để các lỗi nên được khắc phục tương đối nhanh.

https://rubygems.org/gems/xmldsig

2

Thật không may, XML s sự sáng tạo và xác minh vô lý là rất phức tạp. Chi tiết có thể được tìm thấy trong số spec. Tôi bắt đầu thực hiện nó để đề xuất như là một bổ sung cho stdlib some time ago, nhưng sau đó dừng lại vì một dự án khác trở nên quan trọng hơn và Nokogiri bắt đầu cung cấp các tính năng Canonicalization mà tôi cần và tiếc là đã được triển khai trực tiếp bằng cách sử dụng libxml. Bạn có thể muốn có một cái nhìn ở đó để xem những gì cần thiết, và sau đó chuyển các ý tưởng thành mã Nokogiri đơn giản.

Sử dụng chúng, bạn có thể triển khai hoàn toàn XML-DSIG trong Ruby. Nhưng hãy chuẩn bị, nó không phải là một điều dễ dàng để làm, rất nhiều và rất nhiều chi tiết nhỏ có tiềm năng lớn để thúc đẩy bạn hạt ...

Bạn có thể tốt hơn bằng cách chuyển sang JRuby và tích hợp default implementation của XML -DSIG đi kèm với các thư viện chuẩn Java.

1

Dưới đây là một viên ngọc có thể sử dụng để ký kết/tiêu hóa, tuy nhiên tôi vẫn còn có một số vấn đề với hợp quy và có lẽ đó là lý do tại sao tôi không nhận được tiêu hóa thích hợp: https://github.com/ebeigarts/signer