In message <876513vce0.fsf / serein.a02.aist.go.jp>,
 `Tanaka Akira <akr / m17n.org>' wrote:
> open-uri で https を扱うことを考えていろいろと調べていた所、openssl で、
> SSL_CTX_set_default_verify_paths および
> X509_STORE_set_default_paths
> が Ruby レベルに提供されていないことに気がつきました。
> 
> これらが提供されていないのは意図されているのでしょうか?

SSL_CTX_set_default_verify_pathsはOpenSSL::SSL::SSLContextの
構造の都合で提供していません。この関数は、例えば次のように用
いられます。

 if (!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)){
   if (!SSL_CTX_set_default_verify_paths(ctx)){
     /* error */
   }
 }

(すでにご存知だと思いますが)OpenSSL::SSL::SSLContextにパラメー
タを設定する各メソッドは、直接にはSSL_CTX構造体に反映せずに
インスタンス変数だけをセットします。実際に反映されるのは
SSLSocketが開始される時なので、対応するコードを次のように書
くことができません。

  ctx = OpenSSL::SSL::SSLContext.new
  begin
    ctx.ca_file = "/path/cacert.crt"
    ctx.ca_path = "/path/cacerts"
  rescue
    # SSL_CTX_load_verify_locationsに対応するメソッド
  end

これをできるようにするにはext/openssl/ossl_ssl.cの大部分を書
き直す必要があって、すぐには対応できそうにありません。

一方、X509_STORE_set_default_pathsは抜けているだけなので、
OpenSSL::X509::Store#set_default_pathsを追加します。
証明書検証まわりのパラメータはOpenSSL::X509::Storeにセットし
て、OpenSSL::SSL::SSLContext#cert_store=で渡せば
SSL_CTX_set_default_verify_pathsを呼んだのと同様に動くと思い
ます。

ところで、verify_modeのデフォルトはOpenSSLライブラリに任せて
いるのですが、net/httpsではSSL_VERIFY_PEERをデフォルトにすべ
きだったと考えるようになりました。せめてopen-uriではそうして
はどうでしょうか。

-- 
ごとうゆうぞう