r3n*_*rut 13 ruby ssl soap openssl savon
我很难获得SSL来验证证书.我完全不了解证书是如何运作的,所以这是一个重大的障碍.这是运行脚本时出现的错误:
c:/Ruby191/lib/ruby/1.9.1/net/http.rb:611:in `connect': SSL_connect returned=1 e
rrno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL
::SSL::SSLError)
Run Code Online (Sandbox Code Playgroud)
这是相关的代码:
client = Savon::Client.new order_svc
request = client.create_empty_cart { |soap, http|
http.auth.ssl.cert_file = 'mycert.crt'
http.auth.ssl.verify_mode = :none
http.read_timeout = 90
http.open_timeout = 90
http.headers = { "Content-Length" => "0", "Connection" => "Keep-Alive" }
soap.namespaces["xmlns:open"] = "http://schemas.datacontract.org/2004/07/Namespace"
soap.body = {
"wsdl:brand" => brand,
"wsdl:parnter" => [
{"open:catalogName" => catalogName, "open:partnerId" => partnerId }
] }.to_soap_xml
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
检查你的cert.pem和你的key.pem
cert密钥应该有一个
-----BEGIN CERTIFICATE-----
MIIFGDCCBACgAwIBAgIKG1DIagAAAAAAAzANBgkqhkiG9w0BAQsFADCBvDEkMCIG
....
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
你的key.pem应该有
-----BEGIN PRIVATE KEY-----
CSqGSIb3DQEJARYVY2Fjb250YWN0QGVzY3JlZW4uY29tMQswCQYDVQQGEwJVUzEP
....
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
它可能有一些证书,但对于这种情况无关紧要.(虽然它对我而言,因为curl在没有额外证书的情况下不起作用)我正在谈论的web服务具有良好的根CA,但客户端auth密钥不受信任,因此这可能是额外的证书使curl工作的原因.
从客户证书中获取这些是导致我出现问题的原因.
这对我有用.
openssl pkcs12 -in Client.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in Client.pfx -nodes -out key.pem
Run Code Online (Sandbox Code Playgroud)
每个都会提示您输入导入密码,如果需要,您可以设置pem密码.(你必须稍后在ruby代码中设置它)
require 'savon'
client = Savon::Client.new "https://service/Service.asmx?wsdl"
client.http.auth.ssl.cert_key_file = "key.pem"
client.http.auth.ssl.cert_file = "cert.pem"
client.http.auth.ssl.verify_mode=:peer
p client.wsdl.soap_actions
Run Code Online (Sandbox Code Playgroud)
你也可以用卷曲测试
curl -v -E key.pem https://services/Service.asmx?wsdl
Run Code Online (Sandbox Code Playgroud)
注意:我正在较低级别的环境中进行测试自动化,这些环境没有正确签名的证书,并且经常会由于域签名不匹配而引发错误。对于当前的问题,绕过签名是一个看似合理的解决方案,但它不是用于生产级开发的解决方案。
我的问题是我正在尝试验证自签名证书。我所要做的就是输入以下代码并省略与验证证书有关的任何内容。
我必须对遇到相同问题的 SOAP 和 REST 调用执行此操作。
使用 Savon 的 SOAP
client = Savon::Client.new order_svc
request = client.create_empty_cart { |soap, http|
http.auth.ssl.verify_mode = :none
http.headers = { "Content-Length" => "0", "Connection" => "Keep-Alive" }
soap.namespaces["xmlns:open"] = "http://schemas.datacontract.org/2004/07/Namespace"
soap.body = {
"wsdl:brand" => brand,
"wsdl:parnter" => [
{"open:catalogName" => catalogName, "open:partnerId" => partnerId }
] }.to_soap_xml
}
Run Code Online (Sandbox Code Playgroud)
使用 HTTPClient 进行 REST
client = HTTPClient.new
client.ssl_config.verify_mode=(OpenSSL::SSL::VERIFY_NONE)
resp = client.get(Methods)
Run Code Online (Sandbox Code Playgroud)