Ruby on Rails SSL连接错误

3
我有一个控制器 courses_controller.rb:
class CoursesController < ApplicationController
  def index
    @search_term = params[:looking_for] || 'jhu'
    @courses = Coursera.for(@search_term)
  end
end

以下模型 - coursera.rb:
class Coursera
    include HTTParty

    base_uri 'https://api.coursera.org/api/catalog.v1/courses'
    default_params fields: "smallIcon,shortDescription", q: "search"
    format :json

    def self.for term
        get("", query: { query: term})["elements"]
    end
end

接下来是视图文件 index.html.erb:

<h1>Searching for - <%= @search_term %></h1>

<table border="1">
    <tr>
        <th>Image</th>
        <th>Name</th>
        <th>Description</th>
    </tr>
    <% @courses.each do |course| %>
    <tr class=<%= cycle('even', 'odd') %>>
        <td><%= image_tag(course["smallIcon"])%></td>
        <td><%= course["name"] %></td>
        <td><%= course["shortDescription"] %></td>
    </tr>
    <% end %>
</table>

但是,当我访问http://localhost:3000/courses/index时,我收到以下错误信息:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed Application Trace | Framework Trace | Full Trace app/models/coursera.rb:9:in for' app/controllers/courses_controller.rb:4:inindex'

请告诉我该怎么办。什么都不起作用!


尝试将 get("", query: { query: term})["elements"] 更改为 get("", query: { query: term, verify: false})["elements"]。 - RichardAE
verify: false 跳过 SSL 认证。 - RichardAE
3个回答

0

看起来它在抱怨没有有效的证书?如果是这种情况,您可以告诉HTTParty暂时忽略无效的证书,像这样:

class Coursera
    include HTTParty

    default_options.update(verify: false)

...

如果这样可以的话,那么你可能想弄清楚为什么它认为证书无效。

是的,这个可行!现在,为什么证书无效?我可以从哪里获取有效的证书? - user3591433
所以这是一个有效的证书,根据提供的信息,我不知道关于您的服务器足够的信息来确切地说,但您需要将Godaddy证书颁发机构(证书颁发者)添加到Rails正在使用的服务器存储中。这是本地虚拟机吗? - Mike K.
是的,这是一个本地虚拟机。 - user3591433
请注意,将HTTParty的证书授权文件设置为您的虚拟机:http://www.rubydoc.info/github/jnunemaker/httparty/HTTParty%2FClassMethods%3Assl_ca_file - Mike K.

0

由于您忽略了无效的证书,Mike上面发布的答案对您来说是有效的。

嗯,这可能是一个解决办法来完成这件事。但是不建议将此代码用于生产环境。

所以最好只在开发环境中忽略它。

只需将以下代码块添加到您的application.rb的末尾,然后您就可以继续了。

if Rails.env.development?
  OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
end

0
base_uri 'https://api.coursera.org/api/catalog.v1/courses'
...

证书包含以下 DNS 名称:

$ openssl s_client -connect api.coursera.org:443 -tls1 -servername api.coursera.org | \
    openssl x509 -text -noout | grep DNS
...
    DNS:*.coursera.org, DNS:coursera.org

当您连接到https://localhost:3000/...时,证书必须包含一个DNS名称为localhost

通用名称(CN)并不重要。重要的是主题备用名称(SAN),它们必须包括您用于联系服务器的所有DNS名称。

另请参阅以下有关创建格式良好的SSL证书的内容:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接