質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

4956閲覧

Ruby 2.3.0でOpenSSLを使用したhttps接続について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/04/18 12:41

###前提・実現したいこと
Ruby 2.3.0でSSL接続をしたいのですが下記のようなメッセージが出てきてどうしても止まってしまいます。
###発生している問題・エラーメッセージ

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError) from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:933:in `connect' from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:863:in `do_start' from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:852:in `start' from C:/Ruby23-x64/test.rb:15:in `<main>'

###該当のソースコード

Ruby

1puts '-'*80 2require 'net/http' 3require 'openssl' 4require 'logger' 5CERT_NOT_FOUND="CERT not found." 6cert=File.expand_path(__FILE__+'\..\ca-bundle.crt') 7raise CERT_NOT_FOUND if !File.exist?(cert) 8ENV["SSL_CERT_FILE"] = File.expand_path(__FILE__+'..\ca-bundle.crt') 9url = URI.parse('https://google.jp/search') 10puts url 11req = Net::HTTP::Get.new(url.path) 12http = Net::HTTP.new(url.host, url.port) 13http.use_ssl = true 14http.verify_mode = OpenSSL::SSL::VERIFY_PEER 15http.ca_file = ENV["SSL_CERT_FILE"] 16http.start {|http| 17 res = http.request(req) 18} 19puts res.body

###試したこと
ENVをca-bundle.crtに設定→変わらず
http.ca_fileをENVに設定→変わらず

###補足情報(言語/FW/ツール等のバージョンなど)
Win7 / ファイルはC\Ruby23-x64\test.rb

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

最悪、http.verify_mode = OpenSSL::SSL::VERIFY_NONEとかで乗り切ろうとか思ったんですけどやっぱりセキュア的にいかがなものかと思いました。
いちおうNONEでどうにか動いたので閉めさせていただきます。

投稿2017/04/22 02:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

gem install certified して
require 'certified' を試してみてはどうでしょうか?
SSL関係はこれでうまくいくこと多いです。

投稿2017/04/18 15:48

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/20 12:16

ためしに上のコードに`require 'certified'`を足してみたんですが同様のエラーが出てしまうみたいです。
guest

0

変数resのスコープがおかしいですが、そこを直すと、Windows7+Ruby2.3で正常に実行できました。
ca-bundle.crtのファイル内容がおかしいと思われます。

#追記
私がテストをしたときは、パスは自分の物に書き換えていたので気づきませんでしたが、単純なタイプミスですね。

Ruby

1puts '-'*80 2require 'net/http' 3require 'openssl' 4require 'logger' 5CERT_NOT_FOUND="CERT not found." 6cert=File.expand_path(__FILE__+'\..\ca-bundle.crt') 7raise CERT_NOT_FOUND if !File.exist?(cert) 8ENV["SSL_CERT_FILE"] = File.expand_path(__FILE__+'\..\ca-bundle.crt') #<====ここ 9url = URI.parse('https://google.jp/search') 10puts url 11req = Net::HTTP::Get.new(url.path) 12http = Net::HTTP.new(url.host, url.port) 13http.use_ssl = true 14http.verify_mode = OpenSSL::SSL::VERIFY_PEER 15http.ca_file = ENV["SSL_CERT_FILE"] 16res=nil 17http.start {|http| 18 res = http.request(req) 19} 20puts res.body

本来はこう書いた方が良いでしょう。

Ruby

1File.expand_path(__FILE__+'\..\ca-bundle.crt') 23File.join(__dir__,'ca-bundle.crt')

投稿2017/04/18 13:31

編集2017/04/20 13:08
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/20 12:19

ためしにrequireの前にres=nilと追記してみましたが通りませんでした… ca-bundle.crtは https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt ↑から入手してるんですがおかしいのでしょうか? セキュア方面には詳しくないのでわかりません。 よろしければca-bundle.crtの入手方法を教えていただけますか?
退会済みユーザー

退会済みユーザー

2017/04/21 09:07

File.expand_path(__FILE__+'\..\ca-bundle.crt')からFile.join(__dir__,'ca-bundle.crt')に書き換えても同じエラーが出るのですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問