[#25636] [Oniguruma 3.X] reggnu.c — "K.Kosako" <sndgk393@...>

さっき気がついたのですが、元々は

15 messages 2005/02/05

[#25655] openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — Tanaka Akira <akr@...17n.org>

open-uri で https を扱うことを考えていろいろと調べていた所、openssl で、

9 messages 2005/02/08
[#25670] Re: openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — GOTOU Yuuzou <gotoyuzo@...> 2005/02/10

In message <876513vce0.fsf@serein.a02.aist.go.jp>,

[#25713] pthread trouble on sighandler — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

17 messages 2005/02/18
[#25714] Re: pthread trouble on sighandler — Yukihiro Matsumoto <matz@...> 2005/02/18

まつもと ゆきひろです

[#25755] I/O operation differs signal handler — Minero Aoki <aamine@...>

青木です。

14 messages 2005/02/24
[#25756] Re: I/O operation differs signal handler — Tanaka Akira <akr@...17n.org> 2005/02/24

In article <20050224091450P.aamine@loveruby.net>,

[ruby-dev:25683] Re: openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths

From: Tanaka Akira <akr@...17n.org>
Date: 2005-02-12 13:01:31 UTC
List: ruby-dev #25683
In article <20050211.053825.291449071.gotoyuzo@sawara.does.notwork.org>,
  GOTOU Yuuzou <gotoyuzo@notwork.org> writes:

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

後から [ruby-dev:25254] に気がついたのですが、次のように取り込んでも良
いでしょうか。

Index: lib/open-uri.rb
===================================================================
RCS file: /src/ruby/lib/open-uri.rb,v
retrieving revision 1.34
diff -u -p -r1.34 open-uri.rb
--- lib/open-uri.rb	12 Feb 2005 08:40:08 -0000	1.34
+++ lib/open-uri.rb	12 Feb 2005 12:58:36 -0000
@@ -243,6 +243,11 @@ module OpenURI
 
     resp = nil
     http.start {
+      if (http.verify_mode & OpenSSL::SSL::VERIFY_PEER) != 0
+        unless https_post_connection_check(http.peer_cert, target_host)
+          raise "SSL hostname not match"
+        end
+      end
       req = Net::HTTP::Get.new(request_uri, header)
       if options.include? :http_basic_authentication
         user, pass = options[:http_basic_authentication]
@@ -279,6 +284,31 @@ module OpenURI
     else
       raise OpenURI::HTTPError.new(io.status.join(' '), io)
     end
+  end
+
+  def OpenURI.https_post_connection_check(cert, hostname)
+    subject = cert.subject
+    subject.to_a.each{|oid, value|
+      if oid == "CN" && value == hostname
+        return true
+      end
+    }
+    cert.extensions.each{|ext|
+      if ext.oid == "subjectAltName"
+        general_names = ext.value.split(/,\s+/)
+        general_names.each{|name|
+          if /(:?DNS|IP Address):(.*)/ =~ name
+            reg = Regexp.escape($1)
+            reg = reg.gsub(%r!\\\*!, '[^.]+')
+            reg = Regexp.new('\A' + reg + '\z')
+            if reg.match(hostname)
+              return true
+            end
+          end
+        }
+      end
+    }
+    return false
   end
 
   class HTTPError < StandardError
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread