[ruby-list:50512] Re: OpenSSL::X509::DEFAULT_CERT_FILE の上書き方法
From:
Sugano Yoshihisa(E) <koshian@...>
Date:
2017-04-18 04:44:16 UTC
List:
ruby-list #50512
すがのです。
おかしなメールを送ってしまってすみません 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:koshian@foxking.org>