Project

General

Profile

Actions

Feature #2579

closed

Net::HTTP.start("www.ruby-lang.org", use_ssl: true) で SSL 利用を可能に

Added by naruse (Yui NARUSE) about 14 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-dev:40003]

Description

=begin
従来、Net::HTTP で https アクセスをするためには

http = Net::HTTP.new("www.ruby-lang.org", 443) # port を指定
http.use_ssl = true # use_ssl を true に
http.verify_mode = OpenSSL::SSL::VERIFY_PEER # デフォルトだと検証してくれないので変更
http.start{|h| } # やっと本題
http.finish # 破棄

などとする必要がありました。

この提案では、Net::HTTP(addr, opt){..} という呼び出し方を追加します。
opt はハッシュで、アクセサのある項目を設定する事が出来ます。

なお、折角の新 API なので、この API を使った場合、verify_mode のデフォルトが VERIFY_PEER になっています。
つまり、この API を用いた場合デフォルトで SSL 署名の有効性を検査するため、
期限切れやオレオレ証明書の場合例外が出ます。

これにより、さっきのは以下のように書けます。
Net::HTTP.start("www.ruby-lang.org", use_ssl: true){|h| }

P.S.
なお、以上の例で用いている www.ruby-lang.org は、現在 SSL 証明書が期限切れのため、
この例を今実行すると検証に失敗して例外が出ます。
今は StartCom とかだと無料で 主要環境でルート証明書が入っている Web サーバ用の SSL 証明書が取得できますから、
そういうのに入れ替えた方がいいのではないでしょうか。
=end


Files

http_start.patch (1.92 KB) http_start.patch naruse (Yui NARUSE), 01/09/2010 08:34 PM
Actions #1

Updated by nobu (Nobuyoshi Nakada) about 14 years ago

=begin
なかだです。

At Sat, 9 Jan 2010 20:34:23 +0900,
Yui NARUSE wrote in [ruby-dev:40003]:

この提案では、Net::HTTP(addr, opt){..} という呼び出し方を追加します。
opt はハッシュで、アクセサのある項目を設定する事が出来ます。

なお、折角の新 API なので、この API を使った場合、verify_mode のデフォルトが VERIFY_PEER になっています。
つまり、この API を用いた場合デフォルトで SSL 署名の有効性を検査するため、
期限切れやオレオレ証明書の場合例外が出ます。

verify_modeの指定が面倒なので、こうしてはどうでしょうか。

これにより、さっきのは以下のように書けます。
Net::HTTP.start("www.ruby-lang.org", use_ssl: true){|h| }

Net::HTTP.start("www.ruby-lang.org", use_ssl: true, verify_mode: "none"){|h| }


Index: lib/net/http.rb

--- lib/net/http.rb (revision 26256)
+++ lib/net/http.rb (working copy)
@@ -451,6 +451,23 @@ module Net #:nodoc:
# return value of this method is the newly created Net::HTTP object
# itself, and the caller is responsible for closing it upon completion.

  • def HTTP.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) # :yield: +http+
  •  new(address, port, p_addr, p_port, p_user, p_pass).start(&block)
    
  • def HTTP.start(address, *arg, &block) # :yield: +http+
  •  arg.pop if opt = Hash.try_convert(arg.last)
    
  •  port, p_addr, p_port, p_user, p_pass = *arg
    
  •  port = https_default_port if opt[:use_ssl] && !port
    
  •  http = new(address, port, p_addr, p_port, p_user, p_pass)
    
  •  case verify_mode = opt[:verify_mode]
    
  •  when Symbol, String
    
  •    opt = opt.merge(verify_mode: OpenSSL::SSL.const_get("VERIFY_#{verify_mode.to_s.upcase}"))
    
  •  when nil
    
  •    opt = opt.merge(verify_mode: OpenSSL::SSL::VERIFY_PEER)
    
  •  end
    
  •  http.methods.grep(/\A(\w+)=\z/) do |meth|
    
  •    key = $1.to_sym
    
  •    opt.key?(key) or next
    
  •    http.__send__(meth, opt[key])
    
  •  end
    
  •  http.start(&block)
    
    end

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

Actions #2

Updated by naruse (Yui NARUSE) about 14 years ago

=begin
SSL 証明書の検証をしないというイマイチオススメできない挙動を意味する、
OpenSSL::SSL::VERIFY_NONE の指定をわざわざ楽にする必要はないと思います。
=end

Actions #3

Updated by nobu (Nobuyoshi Nakada) about 14 years ago

=begin
なかだです。

At Sun, 10 Jan 2010 07:34:48 +0900,
Yui NARUSE wrote in [ruby-dev:40012]:

SSL 証明書の検証をしないというイマイチオススメできない挙動を意味する、
OpenSSL::SSL::VERIFY_NONE の指定をわざわざ楽にする必要はないと思います。

なるほど。VERIFY_FAIL_IF_NO_PEER_CERTとかはどうなんだろう、と思
いましたがひょっとしてこのへんはビットフラグですか。

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

Actions #4

Updated by naruse (Yui NARUSE) about 14 years ago

=begin
ビットフラグですね。
で、VERIFY_FAIL_IF_NO_PEER_CERT ですがこれはサーバー用のフラグなので、
クライアント用ライブラリである net/http では使われないはずです。
=end

Actions #5

Updated by naruse (Yui NARUSE) about 14 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r26297.
Yui, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0