RestClient无法使用SSL客户端证书获取资源

Dun*_*yne 5 ruby ssl rest-client

我正在尝试使用RestClient来检索使用SSL客户端证书保护的页面.我的代码如下:

require 'restclient'

p12 = OpenSSL::PKCS12.new(File.read('client.p12'), 'password')
client = RestClient::Resource.new('https://example.com/',
                                  :ssl_client_key => p12.key,
                                  :verify_ssl => OpenSSL::SSL::VERIFY_NONE)
client.get
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我看到以下故障:

1.9.3-p374 :007 > client.get
RestClient::BadRequest: 400 Bad Request
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/abstract_response.rb:48:in `return!'
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:230:in `process_result'
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:178:in `block in transmit'
    from /home/duncan/.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/net/http.rb:745:in `start'
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:172:in `transmit'
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute'
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute'
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/resource.rb:51:in `get'
    from (irb):7
    from /home/duncan/.rvm/rubies/ruby-1.9.3-p374/bin/irb:13:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我很确定这是一次验证失败,因为如果我没有安装客户端证书,我会在浏览器中遇到同样的错误.

我正在使用,OpenSSL::SSL::VERIFY_NONE因为服务器有一个自签名证书,我相信这是通过忽略它的正确值.

任何有关如何使这项工作的建议将不胜感激 - 即使指向一些详细的文档,或建议不同的宝石可以工作.我对Gem docs或Google没有太多运气:(

rha*_*oto 7

您的HTTPS请求将需要客户端证书以及密钥.尝试:

client = RestClient::Resource.new('https://example.com/',
                                  :ssl_client_cert => p12.certificate,
                                  :ssl_client_key => p12.key,
                                  :verify_ssl => OpenSSL::SSL::VERIFY_NONE)
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以尝试捕获握手数据包(例如使用WireShark)以验证API是否提供证书.

  • 使用`VERIFY_NONE`的解决方案在如此多的级别中是错误的...当您不验证证书时,使用ssl有什么意义? (6认同)
  • 是的,但是当SO充满了'VERIFY_NONE`的接受答案时,没有任何解释它实际上可能做什么,那么这样的代码很可能会到处都是,并且不会验证任何证书. (4认同)
  • @JarmoPertman`VERIFY_NONE`在针对具有自签名证书的服务器进行本地开发时非常有用。 (2认同)