我正在使用Savon gem使用类似于下面的代码来发出SOAP请求.它工作正常,但我想查看/捕获请求XML而不实际调用他们的服务器.通过在请求之后粘贴调试器行并检查客户端变量,我可以在发出请求后立即查看它.
有没有人知道在不实际发出请求的情况下查看请求XML的方法?我希望能够使用Cucumber或Rspec对模式验证XML.
client = Savon::Client.new do |wsdl, http|
wsdl.document = "http://fakesite.org/fake.asmx?wsdl"
end
client.request(:testpostdata, :xmlns => "http://fakesite.org/") do
soap.header = { :cAuthentication => {"UserName" => "MyName", "Password" => "MyPassword" } }
soap.body = { :xml_data => to_xml }
end
Run Code Online (Sandbox Code Playgroud) 我正在使用Savon为SOAP服务编写Ruby接口.它似乎正在工作,但我在命令行上出现了几个DEBUG消息
D, [2011-02-15T16:33:32.664620 #4140] DEBUG -- : HTTPI tried to use the httpclient adapter, but was unable to find the library in the LOAD_PATH. Falling back
using the net_http adapter now.
D, [2011-02-15T16:33:32.820863 #4140] DEBUG -- : HTTPI executes HTTP POST using the net_http adapter
D, [2011-02-15T16:33:32.664620 #4140] DEBUG -- : HTTPI tried to use the httpclient adapter, but was unable to find the library in the LOAD_PATH. Falling back
using the net_http adapter now.
D, [2011-02-15T16:33:32.820863 #4140] DEBUG -- …
我正在努力让Savon宝石连接到我们的服务器之一.我不断收到错误声明我无法通过ssl.我已经阅读了大量的教程和修复,但似乎都没有.
任何帮助表示赞赏 - 这将使我的星期一,如果我可以通过它:-).
错误:
D, [2011-06-20T09:43:02.002993 #10328] DEBUG -- : Retrieving WSDL from: http://path_to_wsdl:4443/sm/services/mailing/2009/03/02?wsdl
D, [2011-06-20T09:43:02.129057 #10328] DEBUG -- : HTTPI executes HTTP GET using the httpclient adapter
/.rvm/gems/ruby-1.9.2-p0/gems/httpclient-2.2.1/lib/httpclient/session.rb:276:in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: sslv3 alert unexpected message (OpenSSL::SSL::SSLError)
Run Code Online (Sandbox Code Playgroud)
我的代码:
require 'savon'
client = Savon::Client.new "path_to_my_wsdl"
client.http.auth.ssl.cert_file = "path/cert.pem"
client.http.auth.ssl.cert_key_file = "/path/localhost.key"
client.http.auth.ssl.verify_mode = :none
client.wsse.credentials "username", "password"
client.wsdl.soap_actions
Run Code Online (Sandbox Code Playgroud) 根据这个页面,我可以看到 HTTPI 在哪里根据OpenSSL::X509::DEFAULT_CERT_FILE常量寻找我的 SSL 证书:
2.1.5 :008 > OpenSSL::X509::DEFAULT_CERT_FILE
=> "/usr/lib/ssl/cert.pem"
Run Code Online (Sandbox Code Playgroud)
我的证书在别处,但该页面说我可以使用环境变量更改 Ruby 查看的路径SSL_CERT_FILE。我在 .bashrc 中做到了:
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
Run Code Online (Sandbox Code Playgroud)
Rails 找到环境变量:
2.1.5 :007 > ENV['SSL_CERT_FILE']
=> "/etc/ssl/certs/ca-certificates.crt"
Run Code Online (Sandbox Code Playgroud)
但这对 OpenSSL 常量没有影响:
2.1.5 :008 > OpenSSL::X509::DEFAULT_CERT_FILE
=> "/usr/lib/ssl/cert.pem"
Run Code Online (Sandbox Code Playgroud)
那个页面设置的效果有问题SSL_CERT_FILE吗?或者常量永远不会改变并且它会影响其他一些设置?最终,没有找到证书,所以我需要知道它是什么/如何检查/如何设置它。
一等奖是一种类似的方法,默认设置由环境变量设置,因为我不想硬编码证书的路径。
我正在使用Savon和HTTPi,一个Ruby soap客户端和一个Ruby HTTP客户端接口,通过SSL写一个soap请求.这是代码:
client = Savon::Client.new(original_class.constantize.wsdl_url)
client.http.auth.ssl.cert_key_file = "path_to_the_key"
client.http.auth.ssl.cert_key_password = 'secret'
client.http.auth.ssl.cert_file = "path_to_the_certification"
client.http.auth.ssl.verify_mode = :none
@response = client.request :ins0, action do
soap.body = encoded_body
end
Run Code Online (Sandbox Code Playgroud)
这是我实现这一目标的唯一方法.但是,我知道还有其他三种验证模式,它们是:
如果我将验证模式更改为上述任何其他模式,我会收到此错误:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
Run Code Online (Sandbox Code Playgroud)
然后是我的问题(我的问题):
我阅读了有关验证模式的OpenSSL文档:
http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
关于客户端模式下的SSL_VERIFY_NONE,说:
使用SSL_get_verify_result(3)函数进行TLS/SSL握手后,可以检查证书验证过程的结果.无论验证结果如何,握手都将继续.
我应该担心吗?我应该看看验证模式:none是危险的吗?
我问的是,因为我无法使其与其他验证模式一起工作,所以我想以现在的工作方式通过SSL功能发布soap请求.但如果这可能是危险的,我肯定不会这样做.