open-uriなどでcertificate verify failedと怒られる
httpsのサイトにopen-uriなどで接続すると
“certificate verify failed”というエラーが表示されてしまうことがあります。
「証明書検証に失敗しました」ってことですね。
seleniumやnokogiriで画像を保存しようとすると空のファイルが保存される
selenium webdriverやnokogiriで画像を保存しようとすると以下のようになります。
require 'selenium-webdriver'
require 'open-uri'
driver = Selenium::WebDriver.for :chrome
###この辺にページでの処理###
# 画像のURLを取得
url = driver.find_element(:id, 'gazo').find_element(:tag_name, 'img').attribute("src")
# user agentの設定
opt = {}
opt['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/XXXXXXXXXXXXX Safari/XXXXXX Vivaldi/XXXXXXXXXX'
# ファイルを作って画像を上書き
open("image_file.jpg", 'wb') do |output|
open(url,opt) do |data|
output.write(data.read)
end
end
取得元の画像のURLがhttpsだと画像データが取得できずに空のファイルのままになってしまいます。
証明書を取得して読み込む
“certificate verify failed”と怒られているので証明書を取得して保存しましょう。
証明書の保存先はpathの通っているディレクトリか実行ファイルと同じディレクトリが良いと思います。
今回は実行ファイルと同じディレクトリに保存しましょう。
http://curl.haxx.se/ca/cacert.pem
cacert.pemが保存できたら以下のようにコードを変更しましょう。
# cacert.pemがあるディレクトリのパス
ENV["SSL_CERT_FILE"] = "./cacert.pem"
require 'selenium-webdriver'
require 'open-uri'
# open-sslを使ってみる
require 'open-ssl'
driver = Selenium::WebDriver.for :chrome
###この辺にページでの処理###
url = driver.find_element(:id, 'gazo').find_element(:tag_name, 'img').attribute("src")
opt = {}
opt['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/XXXXXXXXXXXXX Safari/XXXXXX Vivaldi/XXXXXXXXXX'
open("image_file.jpg", 'wb') do |output|
open(url,opt) do |data|
output.write(data.read)
end
end
たった2行の追加で完了です。
cacert.pemがパスの通ったディレクトリにあるのであれば
ENV["SSL_CERT_FILE"] = "./cacert.pem"
この行は必要ありません。
どうですか?ちゃんといけましたね!
もしかしたら’open-ssl’は要らないかもしれません。試してみてくださいね。


コメント