Ruby - ウェブスクレイピング - certified
- 1. 概要
- 2. 開いてみる
- 3. VERIFY_NONE してみる
1. 概要
よく理解していないのですが・・・。
https のサイトを通常のオープンで開こうとするとエラーになるのだ。
本項は以下のサイトを参考にさせていただきました。
「Windows 上の Ruby で SSL 接続時に certificate verify failed が出る場合の対処」
「Ruby の https 通信で ... とりあえず動かしたいとき。」
これらを読むと証明書の場所を自前で定義してそこに証明書を配置するか、証明書のチェックを行わないようにするしかなさそうです。
いささか古い記事を読むと「net/https」を使うようなことを書いていますが、Ruby のマニュアルを読むと「net/https」は 1.9.2 で「net/http」にマージされているようです。
「Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > net/https ライブラリ 」
「Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > net/http ライブラリ 」
でまぁ「net/http」も使い方がよ~わからんのです。
で「open-uri」のまま使える
「open-uri の HTTPS リクエストで certificate verify failed 」
が、わたしには一番使いやすそうです。
2. 開いてみる
実際、どういう現象かと言うと
#!/usr/bin/env ruby
=begin
URI をオープンしてみる
=end
require('open-uri')
begin
uri = URI.encode('https://freebsd.sing.ne.jp/')
uri = URI.parse(uri)
html = open(uri).read
rescue => error
puts("例外発生[#{error.class}]")
error.backtrace_locations.each do | line |
puts("#{line}")
end
puts("[#{self.class.name}][#{error.message}]")
end
てなソースを実行すると
> ./ソースファイル名.rb
例外発生[OpenSSL::SSL::SSLError]
/usr/local/lib/ruby/2.4/net/protocol.rb:44:in `connect_nonblock'
/usr/local/lib/ruby/2.4/net/protocol.rb:44:in `ssl_socket_connect'
/usr/local/lib/ruby/2.4/net/http.rb:948:in `connect'
/usr/local/lib/ruby/2.4/net/http.rb:887:in `do_start'
/usr/local/lib/ruby/2.4/net/http.rb:876:in `start'
/usr/local/lib/ruby/2.4/open-uri.rb:323:in `open_http'
/usr/local/lib/ruby/2.4/open-uri.rb:741:in `buffer_open'
/usr/local/lib/ruby/2.4/open-uri.rb:212:in `block in open_loop'
/usr/local/lib/ruby/2.4/open-uri.rb:210:in `catch'
/usr/local/lib/ruby/2.4/open-uri.rb:210:in `open_loop'
/usr/local/lib/ruby/2.4/open-uri.rb:151:in `open_uri'
/usr/local/lib/ruby/2.4/open-uri.rb:721:in `open'
/usr/local/lib/ruby/2.4/open-uri.rb:31:in `open'
../open/open_uri.rb:15:in `<main>'
[Object][SSL_connect returned=1 errno=0 state=error: certificate verify failed]
ということになるのです。
3. VERIFY_NONE してみる
参考サイトに習って
#!/usr/bin/env ruby
=begin
URI をオープンしてみる
=end
require('pry')
require('open-uri')
require('openssl')
begin
OpenSSL::SSL.module_eval{ remove_const(:VERIFY_PEER) }
OpenSSL::SSL.const_set( :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE )
uri = URI.encode('https://freebsd.sing.ne.jp/')
uri = URI.parse(uri)
html = open(uri).read
rescue => error
puts("例外発生[#{error.class}]")
error.backtrace_locations.each do | line |
puts("#{line}")
end
puts("[#{self.class.name}][#{error.message}]")
end
というソースを書いてみました。
これはエラーが発生しませんでしたので、これでいこうと思います。
|
|