Clifton Labrum
Clifton Labrum

Reputation: 14060

Ruby Net HTTP Post: Certificate Verify Failed

Ruby 2.0, Rails 4.0.2

I have read a number of SO posts about the error I'm getting, and I'm still confused. Here's what I'm trying to do.

I'm running a Rails app on an Ubuntu server: https://rails.example.com. It has a PositiveSSL certificate for the domain from Comodo.

From within that Rails app, I'm trying to post data to a form on another one of my servers: https://api.example.com. It also has a PositiveSSL certificate.

Here's my code:

require 'net/http'
require 'uri'

uri = URI('https://app.pilotpro.com/scripts/migrate.php')

Net::HTTP.start(uri.host, uri.port,
  :use_ssl => uri.scheme == 'https') do |http|
  request = Net::HTTP::Get.new uri

  response = http.request request 

  logger.info "::: #{response}"
end

This results in this error:

OpenSSL::SSL::SSLError at /test
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: 
certificate verify failed

I don't get any SSL errors when I view these sites in my web browser, but I think I'm supposed to do something to tell my request about the certificate on the API server, but I am unsure.

Can someone give me some direction on what steps I need to take to make this request not fail?

Upvotes: 1

Views: 2419

Answers (1)

Steffen Ullrich
Steffen Ullrich

Reputation: 123260

openssl s_client -connect app.pilotpro.com:443 -CApath /etc/ssl/certs/ gives:

Certificate chain
 0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=app.pilotpro.com
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=PositiveSSL CA 2

That is the complete chain, which means, that your client expects to have PositiveSSL CA 2 as a trusted Root-CA in the CA store. But, this is not the case because this CA is just an intermediate CA so your HTTPS server should send all the intermediate CAs on the path to the trusted Root-CA.

So this is not a client-side, but a server-side problem. See also http://www.positivessl.com/ssl-certificate-support/cert_installation/apache-ssl.php

The reason you get no errors if you access it from browsers might be, that browsers cache intermediate CAs. So if the browser once connected to a host which provided the correct certificate chain it can from now on deal with hosts which omit the needed chain. With firefox you might try access with a fresh browser profile, which does not have any certificates cached.

Upvotes: 3

Related Questions