Ruby控制器中的“证书验证失败”

时间:2016-02-10 11:08:59

标签: ruby-on-rails-4 openssl ssl-certificate

我是新手,我尝试创建一个应用程序来列出船租赁公司,并允许用户对它们进行评论。首先,我想允许用户创建Renters。我使用omniauth进行Facebook连接。它适用于生产,但不适用于localhost。

当我尝试添加租借者时,在租用者视图上的提交按钮之后,我有错误:

Started POST "/renters" for ::1 at 2016-02-10 11:20:00 +0100
Processing by RentersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxx...xxx", "renter"=>{"name"=>"bastia", "address"=>"bastia", "latitude"=>"", "longitude"=>"", "website"=>"", "email"=>"", "phone"=>"", "user_id"=>""}, "commit"=>"Valider"}
(0.3ms)  BEGIN
(0.4ms)  ROLLBACK
Completed 500 Internal Server Error in 34ms (ActiveRecord: 0.7ms)

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
  app/controllers/renters_controller.rb:44:in `create'

这是renters_controller.rb

class RentersController < ApplicationController
  before_action :set_renter, only: [:show, :edit, :update, :destroy]

  def create
    @renter = Renter.new(renter_params)

    if @renter.save
      gflash notice: "Le loueur a bien été enregistré"
      redirect_to '/'
    else
      gflash :now, notice: "Une erreur est survenue."
      render :new
    end
  end

  def renter_params
    params.require(:renter).permit(:name, :address, :website, :email, :phone, :review, :latitude, :longitude, :user_id)
  end

end

和模型renter.rb

class Renter < ActiveRecord::Base
  geocoded_by :address
  after_validation :geocode
  reverse_geocoded_by :latitude, :longitude
  after_validation :reverse_geocode  # auto-fetch address
end

有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

要使Facebook连接在开发环境中工作,您必须首先在Facebook Developers帐户中创建一个测试应用程序:

设置: - 应用领域:localhost - 网站网址:http://localhost:3000/

然后在您的应用中输入app idapp secret(如果您使用费加罗,则在您的application.yml中),如下所示:

application.yml

development:
    OAUTH_FACEBOOK_ID: 'facebook-id'
    OAUTH_FACEBOOK_SECRET: 'facebook-secret' 

然后你可以在你的devise.rb

中使用它

devise.rb

config.omniauth :facebook, ENV['OAUTH_FACEBOOK_ID'], ENV['OAUTH_FACEBOOK_SECRET'], 
scope: 'public_profile', image_size: {height: 1600}, info_fields: 'name, id, first_name, 
last_name, gender, hometown, cover, email, link' # list of permissions

答案 1 :(得分:0)

  

它适用于生产,但不适用于localhost ......

在localhost上进行开发时,您可以通过创建CA,为localhost创建CSR,然后让CA签署CSR来为公共设备建模。最后,您在dev Web服务器上使用证书,并在本地信任库中安装CA.

成为您自己的CA意味着事情将在浏览器和其他用户代理中“正常工作”。如果您尝试使用自签名证书路由(如下所述),那么大多数用户代理都可以,但浏览器将是一个痛点。

有关成为您自己的CA并为开发人员工作站颁发证书的信息,请参阅How do you sign Certificate Signing Request with your Certification Authority?

您也可以创建自签名证书以避免CA和CSR的内容。在这种情况下,您将告诉Ruby信任localhost的自签名证书而不是CA.

对于大多数用户代理来说,你应该没问题,但浏览器将是一个痛点,因为它们已经违背了自签名证书。

要创建自签名证书,请参阅How to create a self-signed certificate with openssl?How can I generate a self-signed certificate with SubjectAltName using OpenSSL?

您不应该这样做: :use_https => false