13

我很难让 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)

以下是相关代码:

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

      }

任何帮助表示赞赏。

4

4 回答 4

5

检查你的 cert.pem 和你的 key.pem

证书密钥应该有一个

-----BEGIN CERTIFICATE-----
MIIFGDCCBACgAwIBAgIKG1DIagAAAAAAAzANBgkqhkiG9w0BAQsFADCBvDEkMCIG
....
-----END CERTIFICATE-----

你的 key.pem 应该有

-----BEGIN PRIVATE KEY-----
CSqGSIb3DQEJARYVY2Fjb250YWN0QGVzY3JlZW4uY29tMQswCQYDVQQGEwJVUzEP
....
-----END PRIVATE KEY-----

它可能有一些证书,但这对这种情况无关紧要。(虽然它对我有用,因为 curl 在没有额外证书的情况下无法工作)我正在与之交谈的 Web 服务具有良好的根 CA,但客户端身份验证密钥不受信任,因此这可能是额外证书使 curl 工作的原因。

从您的客户证书中取出这些是导致我出现问题的原因。

这对我有用。

openssl pkcs12 -in Client.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in Client.pfx -nodes -out key.pem

每个都会提示您输入导入密码,您可以根据需要设置 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

你也可以用 curl 测试

curl -v  -E  key.pem  https://services/Service.asmx?wsdl
于 2012-03-29T21:36:48.947 回答
1

您需要提供证书随附的私钥文件。

http.auth.ssl.cert_key_file = "mycert.pem"

如果您的私钥文件已加密,您还需要提供密码:

http.auth.ssl.cert_key_password = "foobar"
于 2010-12-02T01:37:05.660 回答
1

把块放在http.auth.ssl.verify_mode = :none里面client.request对我不起作用。

我不得不使用:

client = Savon::Client.new do |wsdl, http|
  http.auth.ssl.verify_mode = :none
  wsdl.document = #YOUR_WSDL_URL_HERE
end

使用 Savon 0.9.9 和 Ruby 1.9.3-p125

于 2012-02-20T14:16:30.237 回答
0

注意:我在较低级别的环境中使用测试自动化,这些环境没有正确签名的证书,并且由于域签名不匹配而经常抛出错误。对于手头的问题,绕过签名是一个合理的解决方案,但它不是用于生产级开发的解决方案。

我的问题是我正在尝试验证自签名证书。我所要做的就是输入以下代码并省略与验证证书有关的任何内容。

我必须为遇到相同问题的 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

      }

使用 HTTPClient 的 REST

client = HTTPClient.new
client.ssl_config.verify_mode=(OpenSSL::SSL::VERIFY_NONE)
resp = client.get(Methods)
于 2010-12-13T21:28:05.623 回答