以下のコードをHomebrew(のrbenv経由)でインストールしたRubyで実行すると、SSLのエラーが発生します。
require 'uri'
require 'net/http'
uri = URI("https://ruby-lang.org/")
res = Net::HTTP.get_response(uri)
実行結果:
/Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:46:in 'OpenSSL::SSL::SSLSocket#connect_nonblock': SSL_connect returned=1 errno=0 peeraddr=185.199.111.153:443 state=error: certificate verify failed (unable to get certificate CRL) (OpenSSL::SSL::SSLError)
from /Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:46:in 'Net::Protocol#ssl_socket_connect'
from /Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-http-0.8.0/lib/net/http.rb:1777:in 'Net::HTTP#connect'
from /Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-http-0.8.0/lib/net/http.rb:1655:in 'Net::HTTP#do_start'
from /Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-http-0.8.0/lib/net/http.rb:1629:in 'Net::HTTP#start'
from /Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-http-0.8.0/lib/net/http.rb:1064:in 'Net::HTTP.start'
from /Users/username/.rbenv/versions/3.4.7/lib/ruby/gems/3.4.0/gems/net-http-0.8.0/lib/net/http.rb:824:in 'Net::HTTP.get_response'
from test.rb:5:in '<main>'
RaspberryPiOSやUbunutuなどの環境では発生しないエラーです。Copilotに聞くと、certifi というgemを使う方法を推奨されるのですが、なんだかどうもピンと来ません(なぜこれで回避できるの?)。
ということで、macOSで実行する時(=開発中)のみVERIFY_NONEに設定することにしましたが、これもあんまり綺麗ではないですね。。
require 'uri'
require 'net/http'
require 'openssl'
uri = URI("https://ruby-lang.org/")
verify_mode = if RUBY_PLATFORM.include?('darwin')
OpenSSL::SSL::VERIFY_NONE
else
OpenSSL::SSL::VERIFY_PEER
end
Net::HTTP.start(uri.host, uri.port, use_ssl: true, verify_mode: verify_mode) do |http|
res = http.get(uri.request_uri)
end