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 を確認してください

証明書キーには 1 つある必要があります

-----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.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

Savon0.9.9およびRuby1.9.3-p125の使用

于 2012-02-20T14:16:30.237 に答える
1

証明書に付随する秘密鍵ファイルを提供する必要があります。

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

秘密鍵ファイルが暗号化されている場合は、パスワードも指定する必要があります。

http.auth.ssl.cert_key_password = "foobar"
于 2010-12-02T01:37:05.660 に答える
0

注: 私は、適切に署名された証明書がなく、ドメイン署名が一致しないためにエラーがスローされることが多い下位レベルの環境でテストの自動化を行っていました。当面の問題については、署名をバイパスすることはもっともらしい解決策でしたが、製品レベルの開発に使用する解決策ではありません。

私の問題は、自己署名証明書を検証しようとしていることです。私がしなければならなかったのは、次のコードを入れて、証明書の検証に関係することを何も省略したことだけでした。

同じ問題が発生していた SOAP 呼び出しと REST 呼び出しの両方に対して、これを行う必要がありました。

サボンを使った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 に答える