Discussion:
[ruby-list:50510] OpenSSL::X509::DEFAULT_CERT_FILE の上書き方法
(too old to reply)
Yoshihisa Sugano
2017-04-18 00:58:13 UTC
Permalink
すがのです。

さくらのレンタルサヌバ䞊で 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>'
```
--
Sugano Yoshihisa(E) <mailto:***@foxking.org>
Sugano Yoshihisa(E)
2017-04-18 04:43:48 UTC
Permalink
すがのです。
おかしなメールを送ってしまってすみません 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>'
```
--
Sugano Yoshihisa(E) <mailto:***@foxking.org>
Sugano Yoshihisa(E)
2017-04-18 04:44:16 UTC
Permalink
すがのです。
おかしなメールを送ってしまってすみません 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>'
```
--
Sugano Yoshihisa(E) <mailto:***@foxking.org>
U.NAKAMURA
2017-04-18 09:27:24 UTC
Permalink
こんにちは、なかむら(う)です。

In message "[ruby-list:50512] Re: OpenSSL::X509::DEFAULT_CERT_FILE の上書き方法"
Post by Sugano Yoshihisa(E)
どうにか OpenSSL::X509::DEFAULT_CERT_FILE をビルド時でも実行時でも上書きする方法はないでしょうか?
そこではないんですけど、実行時に証明書が指定できればいいのなら、
Net::HTTPS.startのオプション引数 ca_file: 、あるいはopen-uriの
openのオプション引数 ssl_ca_cert: で証明書ファイルのパスを渡せば
いけると思います。


それでは。
--
U.Nakamaura <***@garbagecollect.jp>
松永 肇一
2017-04-19 00:17:25 UTC
Permalink
松永と言います。

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はできました。
役に立てばいいのですが。
Post by Sugano Yoshihisa(E)
すがのです。
おかしなメールを送ってしまってすみません 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>'
```
--
株式会社ライフメディア システム開発部
松永肇一
Sugano Yoshihisa(E)
2017-04-20 06:39:57 UTC
Permalink
すがのです。
みなさんお知恵をありがとうございます。

頂いたお話をまとめると、

1. 環境変数で cert ファイルの位置は上書きできる
2. cert ファイルはスクリプト内でも指定できる

ということですよね。

さっそくどちらも試したのですが状況が変わりませんでした。
ということは cert ファイルの問題ではない、ということになりますよねえ。
ファイルがなかったのでてっきりそれだと思ってたんですが、お恥ずかしい。

試しに OpenSSL をホームディレクトリにインストールして、ruby のビルド時
にそちらを参照するようにしてみたのですが、これだとちゃんと動作しました。

さくらのレンタルサーバ上の openssl の場所を確認してみて、

$ openssl version -d
OPENSSLDIR: "/usr/local/ssl/etc/ssl"

だったので、

RUBY_CONFIGURE_OPTS='--with-openssl-dir=/usr/local/ssl' rbenv install 2.4.1

としてインストールしたら無事動作しました。

cert ファイルの位置も、

$ ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'
"/usr/local/ssl/etc/ssl/cert.pem"
$ ls -l /usr/local/ssl/etc/ssl/cert.pem
lrwxr-xr-x 1 root wheel 38 May 11 2016 /usr/local/ssl/etc/ssl/cert.pem -> /usr/local/share/certs/ca-root-nss.crt

という状態で、正常になってるようです。

configure スクリプトが見つけた OpenSSL の場所がなんらかの理由で別のと
ころになってしまうことがある、ということでしょうかねえ。ちょっと気持ち
悪いですが無事動作してくれて良かったです。

みなさんありがとうございました!

--
Sugano Yoshihisa(E)

Kazuhiro NISHIYAMA
2017-04-18 13:03:30 UTC
Permalink
西山和広です。

On Tue, 18 Apr 2017 09:58:13 +0900,
Post by Sugano Yoshihisa(E)
どうにか OpenSSL::X509::DEFAULT_CERT_FILE をビルド時でも実行時でも上書きする方法はないでしょうか?
% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04
Codename: xenial

の環境で試してみたところ、 OpenSSL::X509::DEFAULT_CERT_FILE がさすファイルが
存在しなくても問題なく繋がりました。

SSL_CERT_FILE がダメなら SSL_CERT_DIR を試すと良いのではないでしょうか。

% /usr/bin/irb -r irb/completion --simple-prompt
Post by Sugano Yoshihisa(E)
RUBY_DESCRIPTION
=> "ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]"
Post by Sugano Yoshihisa(E)
require 'openssl'
=> true
Post by Sugano Yoshihisa(E)
OpenSSL::X509::DEFAULT_CERT_FILE
=> "/usr/lib/ssl/cert.pem"
Post by Sugano Yoshihisa(E)
File.exist? OpenSSL::X509::DEFAULT_CERT_FILE
=> false
Post by Sugano Yoshihisa(E)
require 'open-uri'
=> true
Post by Sugano Yoshihisa(E)
open('https://www.google.com/')
=> #<Tempfile:/tmp/user/1000/open-uri20170418-9096-155vnnx>
Post by Sugano Yoshihisa(E)
OpenSSL::X509::DEFAULT_CERT_DIR
=> "/usr/lib/ssl/certs"
Post by Sugano Yoshihisa(E)
OpenSSL::X509::DEFAULT_CERT_DIR_ENV
=> "SSL_CERT_DIR"
% SSL_CERT_DIR=. /usr/bin/irb -r irb/completion --simple-prompt
Post by Sugano Yoshihisa(E)
require 'open-uri'
=> true
Post by Sugano Yoshihisa(E)
open('https://www.google.com/')
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
from /usr/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock'
from /usr/lib/ruby/2.3.0/net/http.rb:933:in `connect'
from /usr/lib/ruby/2.3.0/net/http.rb:863:in `do_start'
from /usr/lib/ruby/2.3.0/net/http.rb:852:in `start'
from /usr/lib/ruby/2.3.0/open-uri.rb:319:in `open_http'
from /usr/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_open'
from /usr/lib/ruby/2.3.0/open-uri.rb:212:in `block in open_loop'
from /usr/lib/ruby/2.3.0/open-uri.rb:210:in `catch'
from /usr/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop'
from /usr/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri'
from /usr/lib/ruby/2.3.0/open-uri.rb:717:in `open'
from /usr/lib/ruby/2.3.0/open-uri.rb:35:in `open'
from (irb):2
from /usr/bin/irb:11:in `<main>'
--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)
Loading...