diff --git a/lib/openssl/config.rb b/lib/openssl/config.rb
index 9a0b7874..5e4c51f7 100644
--- a/lib/openssl/config.rb
+++ b/lib/openssl/config.rb
@@ -52,7 +52,11 @@ def parse(string)
       # Raises a ConfigError on invalid configuration data.
       def parse_config(io)
         begin
-          parse_config_lines(io)
+          if io.instance_of?(String)
+            parse(io)
+          else
+            parse_config_lines(io)
+          end
         rescue => error
           raise ConfigError, "error in line #{io.lineno}: " + error.message
         end
@@ -414,6 +418,8 @@ def sections
       @data.keys
     end
 
+    alias keys sections
+
     ##
     # Get the parsable form of the current configuration
     #
diff --git a/src/test/ruby/test_config.rb b/src/test/ruby/test_config.rb
new file mode 100644
index 00000000..94868ed8
--- /dev/null
+++ b/src/test/ruby/test_config.rb
@@ -0,0 +1,50 @@
+# coding: US-ASCII
+require File.expand_path('test_helper', File.dirname(__FILE__))
+require "tempfile"
+
+class TestSSL < TestCase
+  def setup
+    super
+    file = Tempfile.open("openssl.cnf")
+    file << <<__EOD__
+HOME = .
+[ ca ]
+default_ca = CA_default
+[ CA_default ]
+dir = ./demoCA
+certs                =                  ./certs
+__EOD__
+    file.close
+    @tmpfile = file
+    @it = OpenSSL::Config.new(file.path)
+  end
+
+  def test_s_parse
+    c = OpenSSL::Config.parse('')
+    assert_equal("[ default ]\n\n", c.to_s)
+    c = OpenSSL::Config.parse(@it.to_s)
+    assert_equal(['CA_default', 'ca', 'default'], c.sections.sort)
+  end
+
+  def test_s_parse_config
+    ret = OpenSSL::Config.parse_config(@it.to_s)
+
+    assert_equal(@it.sections.sort, ret.keys.sort)
+    assert_equal(@it["default"], ret["default"])
+  end
+
+  def test_sections
+    assert_equal(['CA_default', 'ca', 'default'], @it.sections.sort)
+    Tempfile.create("openssl.cnf") { |f|
+      f.write File.read(@tmpfile.path)
+      f.puts "[ new_section ]"
+      f.puts "foo = bar"
+      f.puts "[ empty_section ]"
+      f.close
+
+      c = OpenSSL::Config.new(f.path)
+      assert_equal(['CA_default', 'ca', 'default', 'empty_section', 'new_section'],
+                   c.sections.sort)
+    }
+  end
+end
\ No newline at end of file