Project

General

Profile

Feature #2579

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

Added by naruse (Yui NARUSE) almost 10 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
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

Associated revisions

Revision 95bff6e8
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30005 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 30005
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

Revision 30005
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

Revision 30005
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

Revision 30005
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

Revision 30005
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

Revision 30005
Added by naruse (Yui NARUSE) about 9 years ago

Improve rdoc of net/http/http.rb.

  • use URI(..)
  • normalize Net::HTTP.start()
  • use Net::HTTP.start(hostname, :use_ssl). Feature #2579

History

#1

Updated by nobu (Nobuyoshi Nakada) almost 10 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

#2

Updated by naruse (Yui NARUSE) almost 10 years ago

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

#3

Updated by nobu (Nobuyoshi Nakada) almost 10 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

#4

Updated by naruse (Yui NARUSE) almost 10 years ago

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

#5

Updated by naruse (Yui NARUSE) almost 10 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

Also available in: Atom PDF