松永と言います。

Windowsでhttpsなサイトにnet/httpでつなごうとすると似た問題にぶつかりま
す。以下のような方法で回避しました。

1) 証明書を自分で用意
curl http://curl.haxx.se/ca/cacert.pem -o./cacert.pem

2) 証明書を自分で設定
    https = Net::HTTP.new(HOST, PORT)
    https.use_ssl = true
    https.ca_file = "/path/to/cacert.pem"

これでnet/httpでのSSLはできました。
役に立てばいいのですが。


On 2017/04/18 13:44, Sugano Yoshihisa (E) wrote:
> すがのです。
> おかしなメールを送ってしまってすみません m(_ _)m
> 
> 別の MUA で以下に再送します。
> 
> さくらのレンタルサーバ上で ruby 2.4.1 を rbenv で入れて利用してる環境があります。
> この環境で https 接続をしようとすると SSL 関連のエラーが出て接続できませんでした(末尾にエラーメッセージを書きます)。
> 
> 原因としては OpenSSL::X509::DEFAULT_CERT_FILE が指し示すパスに証明書が存在しないことです。
> 
> irb(main):001:0> require 'openssl'
> => true
> irb(main):002:0> p OpenSSL::X509::DEFAULT_CERT_FILE
> "/etc/ssl/cert.pem"
> => "/etc/ssl/cert.pem"
> 
> $ ls -l /etc/ssl
> total 12
> -rw-r--r--  1 root  wheel  9483 Dec  4  2012 openssl.cnf
> 
> レンタルサーバなので /etc/ssl に証明書を置くこともできませんし、どうにか OpenSSL::X509::DEFAULT_CERT_FILE を上書きしたいと考えております。
> 
> ドキュメントには OpenSSL::X509::DEFAULT_CERT_FILE_ENV が指し示す環境変数で上書きできるとあるので、irb で見てみたところ SSL_CERT_FILE という文字列が出てきました。
> 
> そこで環境変数 SSL_CERT_FILE に自分のホームディレクトリ以下にある証明書のパスを指定してみたのですが、OpenSSL::X509::DEFAULT_CERT_FILE に変化はありませんし、SSL 接続エラーも変わりません。こちらビルド環境などによって動作しないこともあり得るのでしょうか?
> 
> ビルド時に OpenSSL::X509::DEFAULT_CERT_FILE を指定できれば解決するかと考えたのですが、ビルドオプションを眺めてもちょっと方法が見つけられませんでした。
> 
> ext/openssl/ossl_x509.c の 182 行目
> 
>     DefX509Default(CERT_FILE, cert_file);
> 
> で設定されてるものかとは思うのですが。
> 
> どうにか OpenSSL::X509::DEFAULT_CERT_FILE をビルド時でも実行時でも上書きする方法はないでしょうか?
> 
> 
> エラーの内容は以下のとおりです。
> 
> net/https を利用した場合は以下。
> 
> ```
> /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/protocol.rb:44:in `connect_nonblock': Connection reset by peer - SSL_connect (Errno::ECONNRESET)
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/protocol.rb:44:in `ssl_socket_connect'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:948:in `connect'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:887:in `do_start'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:876:in `start'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:1407:in `request'
>         from ./myscript.rb:52:in `<main>'
> ```
> 
> open-uri を利用した場合は以下のようになります。
> 
> ```
> irb(main):006:0> open('https://www.google.com/')
> OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server c
> ertificate B: certificate verify failed  
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/protocol.rb:44:in `connect_nonblock'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/protocol.rb:44:in `ssl_socket_connect'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:948:in `connect'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:887:in `do_start'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/net/http.rb:876:in `start'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:323:in `open_http'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:741:in `buffer_open'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:212:in `block in open_loop'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:210:in `catch'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:210:in `open_loop'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:151:in `open_uri'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:721:in `open'
>         from /home/XXXXXX/.rbenv/versions/2.4.1/lib/ruby/2.4.0/open-uri.rb:35:in `open'
>         from (irb):6
>         from /home/XXXXXX/.rbenv/versions/2.4.1/bin/irb:11:in `<main>'
> ```
> 

-- 
株式会社ライフメディア システム開発部
松永肇一