106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/webpaynullify.rb', line 106
def sign_xml (input_xml)
document = Nokogiri::XML(input_xml.body)
envelope = document.at_xpath("//env:Envelope")
envelope.prepend_child("<env:Header><wsse:Security xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' wsse:mustUnderstand='1'/></env:Header>")
xml = document.to_s
signer = Signer.new(xml)
signer.cert = OpenSSL::X509::Certificate.new(@public_cert)
signer.private_key = OpenSSL::PKey::RSA.new(@private_key)
signer.document.xpath("//soapenv:Body", { "soapenv" => "http://schemas.xmlsoap.org/soap/envelope/" }).each do |node|
signer.digest!(node)
end
signer.sign!(:issuer_serial => true)
signed_xml = signer.to_xml
document = Nokogiri::XML(signed_xml)
x509data = document.at_xpath("//*[local-name()='X509Data']")
new_data = x509data.clone()
new_data.set_attribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#")
n = Nokogiri::XML::Node.new('wsse:SecurityTokenReference', document)
n.add_child(new_data)
x509data.add_next_sibling(n)
return document
end
|