signer 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/CHANGELOG.md +15 -0
- data/README.md +9 -0
- data/lib/signer.rb +32 -4
- data/lib/signer/version.rb +1 -1
- data/spec/fixtures/input_1.xml +5 -5
- data/spec/fixtures/output_1.xml +18 -11
- data/spec/signer_spec.rb +5 -3
- metadata +18 -31
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWY1OWFhM2YzMDYxMzBiNTE3MTVkNDZiYTg3NDQ4MmM3MzcyMzdhMg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NDI0MWQxNWZkYWI4NmE3YmQ2NzNlMTNiM2Q0OWY5Mzk5M2QyZGU5Mw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZDE0MDRmMGRiMWE4ZjQ5ODUxMjc2M2QwNjMxMTg0NzRlMzNiMGM1YTNmOTk3
|
10
|
+
YzQ1Y2YyMmRmZGI2MThlM2Q5ODk2NjJiOTc0NDBkYjE2ZWZkYzk4MDRhZTc1
|
11
|
+
OTdhODFhZTU4ZjkxYTA4ZGNlZjIwZDA5OWRjZDA5Nzc1ZTdmMWU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YzUwNDQ5MzljOTA1ZThlZTliMTNmZjljYTJlYmFjZDRhMDk1YWMzZDJjMTNl
|
14
|
+
OTY1YmFmMzNkMzNmNWIwNTg2YWY2Njk1ZjEwMGMzYTVjZGRlM2U5ZWE0YWYx
|
15
|
+
Mzc1MzE3MTI1YjQ2MzEzYWQ1OWE3MGIyMDU5YTI5MzgzMTlmM2U=
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
## 1.2.0 (2014-05-06)
|
2
|
+
|
3
|
+
- Id and attribute namespace preserving when digesting the nodes (#1, @Envek)
|
4
|
+
|
5
|
+
## 1.1.1 (2013-04-03)
|
6
|
+
|
7
|
+
- Allow to sign using enveloped-signature
|
8
|
+
|
9
|
+
## 1.1.0 (2012-06-21)
|
10
|
+
|
11
|
+
- Allow to sign XML documents without SOAP
|
12
|
+
|
13
|
+
## 1.0.0 (2012-05-03)
|
14
|
+
|
15
|
+
- Allow to sign SOAP documents
|
data/README.md
CHANGED
@@ -199,3 +199,12 @@ Output:
|
|
199
199
|
</s:Body>
|
200
200
|
</s:Envelope>
|
201
201
|
```
|
202
|
+
|
203
|
+
## Miscellaneous
|
204
|
+
|
205
|
+
If you need to digest a `BinarySecurityToken` tag, you need to construct it yourself **before** signing.
|
206
|
+
|
207
|
+
```ruby
|
208
|
+
signer.digest!(signer.binary_security_token_node) # Constructing tag and digesting it
|
209
|
+
signer.sign! # No need to pass a :security_token option, as we already constructed and inserted this node
|
210
|
+
```
|
data/lib/signer.rb
CHANGED
@@ -9,6 +9,8 @@ class Signer
|
|
9
9
|
attr_accessor :document, :cert, :private_key
|
10
10
|
attr_writer :security_node, :security_token_id
|
11
11
|
|
12
|
+
WSU_NAMESPACE = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
|
13
|
+
|
12
14
|
def initialize(document)
|
13
15
|
self.document = Nokogiri::XML(document.to_s, &:noblanks)
|
14
16
|
end
|
@@ -75,11 +77,12 @@ class Signer
|
|
75
77
|
node = document.xpath("//o:BinarySecurityToken", "o" => "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd").first
|
76
78
|
unless node
|
77
79
|
node = Nokogiri::XML::Node.new('BinarySecurityToken', document)
|
78
|
-
node['u:Id'] = security_token_id
|
79
80
|
node['ValueType'] = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3'
|
80
81
|
node['EncodingType'] = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary'
|
81
82
|
node.content = Base64.encode64(cert.to_der).gsub("\n", '')
|
82
83
|
signature_node.add_previous_sibling(node)
|
84
|
+
wsu_ns = namespace_prefix(node, WSU_NAMESPACE, 'wsu')
|
85
|
+
node["#{wsu_ns}:Id"] = security_token_id
|
83
86
|
key_info_node = Nokogiri::XML::Node.new('KeyInfo', document)
|
84
87
|
security_token_reference_node = Nokogiri::XML::Node.new('o:SecurityTokenReference', document)
|
85
88
|
key_info_node.add_child(security_token_reference_node)
|
@@ -135,13 +138,18 @@ class Signer
|
|
135
138
|
# <DigestValue>aeqXriJuUCk4tPNPAGDXGqHj6ao=</DigestValue>
|
136
139
|
# </Reference>
|
137
140
|
def digest!(target_node, options = {})
|
138
|
-
|
139
|
-
target_node[
|
141
|
+
wsu_ns = namespace_prefix(target_node, WSU_NAMESPACE)
|
142
|
+
current_id = target_node["#{wsu_ns}:Id"] if wsu_ns
|
143
|
+
id = options[:id] || current_id || "_#{Digest::SHA1.hexdigest(target_node.to_s)}"
|
144
|
+
if id.to_s.size > 0
|
145
|
+
wsu_ns ||= namespace_prefix(target_node, WSU_NAMESPACE, 'wsu')
|
146
|
+
target_node["#{wsu_ns}:Id"] = id.to_s
|
147
|
+
end
|
140
148
|
target_canon = canonicalize(target_node)
|
141
149
|
target_digest = Base64.encode64(OpenSSL::Digest::SHA1.digest(target_canon)).strip
|
142
150
|
|
143
151
|
reference_node = Nokogiri::XML::Node.new('Reference', document)
|
144
|
-
reference_node['URI'] = id.size > 0 ? "##{id}" : ""
|
152
|
+
reference_node['URI'] = id.to_s.size > 0 ? "##{id}" : ""
|
145
153
|
signed_info_node.add_child(reference_node)
|
146
154
|
|
147
155
|
transforms_node = Nokogiri::XML::Node.new('Transforms', document)
|
@@ -185,4 +193,24 @@ class Signer
|
|
185
193
|
signed_info_node.add_next_sibling(signature_value_node)
|
186
194
|
self
|
187
195
|
end
|
196
|
+
|
197
|
+
protected
|
198
|
+
|
199
|
+
##
|
200
|
+
# Searches in namespaces, defined on +target_node+ or its ancestors,
|
201
|
+
# for the +namespace+ with given URI and returns its prefix.
|
202
|
+
#
|
203
|
+
# If there is no such namespace and +desired_prefix+ is specified,
|
204
|
+
# adds such a namespace to +target_node+ with +desired_prefix+
|
205
|
+
|
206
|
+
def namespace_prefix(target_node, namespace, desired_prefix = nil)
|
207
|
+
ns = target_node.namespaces.key(namespace)
|
208
|
+
if ns
|
209
|
+
ns.match(/(?:xmlns:)?(.*)/) && $1
|
210
|
+
elsif desired_prefix
|
211
|
+
target_node.add_namespace_definition(desired_prefix, namespace)
|
212
|
+
desired_prefix
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
188
216
|
end
|
data/lib/signer/version.rb
CHANGED
data/spec/fixtures/input_1.xml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<?xml version="1.0"?>
|
2
|
-
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:
|
2
|
+
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:wsurandom="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
|
3
3
|
<s:Header>
|
4
4
|
<a:Action s:mustUnderstand="1">http://tempuri.org/IDocumentService/SearchDocuments</a:Action>
|
5
5
|
<a:MessageID>urn:uuid:30db5d4f-ab84-46be-907c-be690a92979b</a:MessageID>
|
@@ -8,10 +8,10 @@
|
|
8
8
|
</a:ReplyTo>
|
9
9
|
<To xmlns="http://www.w3.org/2005/08/addressing" xmlns:a="http://www.w3.org/2003/05/soap-envelope" a:mustUnderstand="1">http://tempuri.org/PublicServices/Test/1.0.12/PublicServices/DocumentService.svc</To>
|
10
10
|
<o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
|
11
|
-
<
|
12
|
-
<
|
13
|
-
<
|
14
|
-
</
|
11
|
+
<wsurandom:Timestamp>
|
12
|
+
<wsurandom:Created>2012-05-02T18:17:14.467Z</wsurandom:Created>
|
13
|
+
<wsurandom:Expires>2012-05-02T18:22:14.467Z</wsurandom:Expires>
|
14
|
+
</wsurandom:Timestamp>
|
15
15
|
</o:Security>
|
16
16
|
</s:Header>
|
17
17
|
<s:Body>
|
data/spec/fixtures/output_1.xml
CHANGED
@@ -1,38 +1,45 @@
|
|
1
1
|
<?xml version="1.0"?>
|
2
|
-
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:
|
2
|
+
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:wsurandom="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
|
3
3
|
<s:Header>
|
4
4
|
<a:Action s:mustUnderstand="1">http://tempuri.org/IDocumentService/SearchDocuments</a:Action>
|
5
5
|
<a:MessageID>urn:uuid:30db5d4f-ab84-46be-907c-be690a92979b</a:MessageID>
|
6
6
|
<a:ReplyTo>
|
7
7
|
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
|
8
8
|
</a:ReplyTo>
|
9
|
-
<To xmlns="http://www.w3.org/2005/08/addressing" xmlns:a="http://www.w3.org/2003/05/soap-envelope" a:mustUnderstand="1"
|
9
|
+
<To xmlns="http://www.w3.org/2005/08/addressing" xmlns:a="http://www.w3.org/2003/05/soap-envelope" a:mustUnderstand="1" wsurandom:Id="_7e75a8ded22253b163ca76a40b6cc0c670ed0c33">http://tempuri.org/PublicServices/Test/1.0.12/PublicServices/DocumentService.svc</To>
|
10
10
|
<o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
|
11
|
-
<
|
12
|
-
<
|
13
|
-
<
|
14
|
-
</
|
15
|
-
<o:BinarySecurityToken
|
11
|
+
<wsurandom:Timestamp wsurandom:Id="_3e2f6b0b9430b7f2b69712172db02293291f5322">
|
12
|
+
<wsurandom:Created>2012-05-02T18:17:14.467Z</wsurandom:Created>
|
13
|
+
<wsurandom:Expires>2012-05-02T18:22:14.467Z</wsurandom:Expires>
|
14
|
+
</wsurandom:Timestamp>
|
15
|
+
<o:BinarySecurityToken ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" wsurandom:Id="uuid-639b8970-7644-4f9e-9bc4-9c2e367808fc-1">MIICsDCCAhmgAwIBAgIJAOUHvh4oho0tMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTIwNTAzMTMxODIyWhcNMTMwNTAzMTMxODIyWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvK5hMPv/R5IFmwWyJOyEaFUrF/ZsmN+Gip8hvR6rLP3YPNx9iFYvPcZllFmuVwyaz7YT2N5BsqTwLdyi5v4HY4fUtuz0p8jIPoSd6dfDvcnSpf4QLTOgOaL3ciPEbgDHH2tnIksukoWzqCYva+qFZ74NFl19swXotW9fA4Jzs4QIDAQABo4GnMIGkMB0GA1UdDgQWBBRU1WEHDnP8Hr7ZulxrSzEwOcYpMzB1BgNVHSMEbjBsgBRU1WEHDnP8Hr7ZulxrSzEwOcYpM6FJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAOUHvh4oho0tMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEASY/9SAOK57q9mGnNJJeyDbmyGrAHSJTod646xTHYkMvhUqwHyk9PTr5bdfmswpmyVn+AQ43U2tU5vnpTBmKpHWD2+HSHgGa92mMLrfBOd8EBZ329NL3N2HDPIaHr4NPGyhNrSK3QVOnAq2D0jlyrGYJlLli1NxHiBz7FCEJaVI8=</o:BinarySecurityToken>
|
16
16
|
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
17
17
|
<SignedInfo>
|
18
18
|
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
|
19
19
|
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
20
|
-
<Reference URI="#
|
20
|
+
<Reference URI="#_3e2f6b0b9430b7f2b69712172db02293291f5322">
|
21
21
|
<Transforms>
|
22
22
|
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
|
23
23
|
</Transforms>
|
24
24
|
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
25
|
-
<DigestValue>
|
25
|
+
<DigestValue>hUP34KxVar1UE5I87U1kH8MzV+o=</DigestValue>
|
26
26
|
</Reference>
|
27
27
|
<Reference URI="#_7e75a8ded22253b163ca76a40b6cc0c670ed0c33">
|
28
28
|
<Transforms>
|
29
29
|
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
|
30
30
|
</Transforms>
|
31
31
|
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
32
|
-
<DigestValue
|
32
|
+
<DigestValue>/rAVEm0SjaC0ckFViZd+A0hYe+U=</DigestValue>
|
33
|
+
</Reference>
|
34
|
+
<Reference URI="#uuid-639b8970-7644-4f9e-9bc4-9c2e367808fc-1">
|
35
|
+
<Transforms>
|
36
|
+
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
|
37
|
+
</Transforms>
|
38
|
+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
39
|
+
<DigestValue>3UQ13wcqsZOqwueVE7DfSmTGQ9c=</DigestValue>
|
33
40
|
</Reference>
|
34
41
|
</SignedInfo>
|
35
|
-
<SignatureValue>
|
42
|
+
<SignatureValue>BB0CHnd4qA8AVSj/xXrfK29Xa1aCmA9K+X4Bkvc2IsLOmfprXTrSHSb0maEKkFHFCLKH+DEIgCWtDC4rkyiXR5i8iKKZGggoMfD/2Wmw3TcARiQ2pyGrZA04NXTPWHo17nYwBQDhfhafeIKE4zFRXltyW/I/RRO678E3Fd1Ma0Y=</SignatureValue>
|
36
43
|
<KeyInfo>
|
37
44
|
<o:SecurityTokenReference>
|
38
45
|
<o:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#uuid-639b8970-7644-4f9e-9bc4-9c2e367808fc-1"/>
|
data/spec/signer_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Signer do
|
4
|
-
it "should digest and sign SOAP XML with security node and binary token" do
|
4
|
+
it "should digest and sign SOAP XML with security node and digested binary token" do
|
5
5
|
input_xml_file = File.join(File.dirname(__FILE__), 'fixtures', 'input_1.xml')
|
6
6
|
cert_file = File.join(File.dirname(__FILE__), 'fixtures', 'cert.pem')
|
7
7
|
private_key_file = File.join(File.dirname(__FILE__), 'fixtures', 'key.pem')
|
@@ -18,7 +18,9 @@ describe Signer do
|
|
18
18
|
signer.digest!(node)
|
19
19
|
end
|
20
20
|
|
21
|
-
signer.
|
21
|
+
signer.digest!(signer.binary_security_token_node)
|
22
|
+
|
23
|
+
signer.sign!
|
22
24
|
|
23
25
|
# File.open(File.join(File.dirname(__FILE__), 'fixtures', 'output_1.xml'), "w") do |f|
|
24
26
|
# f.write signer.document.to_s
|
@@ -38,7 +40,7 @@ describe Signer do
|
|
38
40
|
signer.private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file), "test")
|
39
41
|
signer.security_node = signer.document.root
|
40
42
|
signer.security_token_id = ""
|
41
|
-
signer.digest!(signer.document, :id => "", :enveloped => true)
|
43
|
+
signer.digest!(signer.document.root, :id => "", :enveloped => true)
|
42
44
|
signer.sign!(:issuer_serial => true)
|
43
45
|
|
44
46
|
# File.open(File.join(File.dirname(__FILE__), 'fixtures', 'output_2.xml'), "w") do |f|
|
metadata
CHANGED
@@ -1,59 +1,52 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Edgars Beigarts
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-05-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
16
|
-
name: rake
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
14
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
15
|
requirements:
|
20
16
|
- - ! '>='
|
21
17
|
- !ruby/object:Gem::Version
|
22
18
|
version: '0'
|
23
|
-
|
24
|
-
|
19
|
+
name: rake
|
20
|
+
type: :development
|
21
|
+
requirement: !ruby/object:Gem::Requirement
|
25
22
|
requirements:
|
26
23
|
- - ! '>='
|
27
24
|
- !ruby/object:Gem::Version
|
28
25
|
version: '0'
|
29
26
|
prerelease: false
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
|
32
|
-
name: rspec
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
28
|
+
version_requirements: !ruby/object:Gem::Requirement
|
35
29
|
requirements:
|
36
30
|
- - ! '>='
|
37
31
|
- !ruby/object:Gem::Version
|
38
32
|
version: '0'
|
39
|
-
|
40
|
-
|
33
|
+
name: rspec
|
34
|
+
type: :development
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
41
36
|
requirements:
|
42
37
|
- - ! '>='
|
43
38
|
- !ruby/object:Gem::Version
|
44
39
|
version: '0'
|
45
40
|
prerelease: false
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
|
48
|
-
name: nokogiri
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
43
|
requirements:
|
52
44
|
- - ! '>='
|
53
45
|
- !ruby/object:Gem::Version
|
54
46
|
version: 1.5.1
|
55
|
-
|
56
|
-
|
47
|
+
name: nokogiri
|
48
|
+
type: :runtime
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
57
50
|
requirements:
|
58
51
|
- - ! '>='
|
59
52
|
- !ruby/object:Gem::Version
|
@@ -69,6 +62,7 @@ files:
|
|
69
62
|
- lib/signer/version.rb
|
70
63
|
- lib/signer.rb
|
71
64
|
- README.md
|
65
|
+
- CHANGELOG.md
|
72
66
|
- LICENSE
|
73
67
|
- spec/fixtures/cert.pem
|
74
68
|
- spec/fixtures/input_1.xml
|
@@ -80,33 +74,26 @@ files:
|
|
80
74
|
- spec/spec_helper.rb
|
81
75
|
homepage: ''
|
82
76
|
licenses: []
|
77
|
+
metadata: {}
|
83
78
|
post_install_message:
|
84
79
|
rdoc_options: []
|
85
80
|
require_paths:
|
86
81
|
- lib
|
87
82
|
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
83
|
requirements:
|
90
84
|
- - ! '>='
|
91
85
|
- !ruby/object:Gem::Version
|
92
|
-
segments:
|
93
|
-
- 0
|
94
86
|
version: '0'
|
95
|
-
hash: -2151872733267505792
|
96
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
88
|
requirements:
|
99
89
|
- - ! '>='
|
100
90
|
- !ruby/object:Gem::Version
|
101
|
-
segments:
|
102
|
-
- 0
|
103
91
|
version: '0'
|
104
|
-
hash: -2151872733267505792
|
105
92
|
requirements: []
|
106
93
|
rubyforge_project:
|
107
|
-
rubygems_version: 1.
|
94
|
+
rubygems_version: 2.1.11
|
108
95
|
signing_key:
|
109
|
-
specification_version:
|
96
|
+
specification_version: 4
|
110
97
|
summary: WS Security XML signer
|
111
98
|
test_files:
|
112
99
|
- spec/fixtures/cert.pem
|