Search code examples
sslglassfishjruby

Using glassfish gem (or other webserver) with SSL


My goal is to deploy a simple rails application on a windows server using the glassfish gem.

I have no trouble getting the glassfish gem to work with regular http, however I now need to add SSL security and I cannot find any links on how to enable https in the glassfish gem.

Has anyone succeeded in setting up the glassfish gem to support SSL?

Are there any other ways to serve a rails application over SSL on windows without any additional software installation (e.g. IIS, Glassfish, jBoss)?


Solution

  • I use jetty-rails gem and I coded SSL support in it.
    If you choose to use jetty-rails as well you can follow these instructions to add SSL.
    Make sure you use jetty-rails version 0.6 as current 0.8.1 is buggy.
    I'm sure that GlassFish too can be made to use SSL in a similar way.
    I chose Jetty as it seems faster (startup) smaller and easier to change the source.

    jetty_rails-0.6/lib/jetty_rails/server.rb +32

      if config[:ssl] and config[:ssl] == true
        if config[:keystore] =~ /^\\/ # starts with slash => absolute dir
          keystore = config[:keystore]
        else # assume keystore is in cofig dir
          keystore = @config[:base] + '/config/' + config[:keystore]
        end
        if not config[:truststore].nil? # have separate truststore
          if config[:truststore] =~ /^\\/ # starts with slash => absolute dir
            truststore = config[:truststore]
          else # assume keystore is in cofig dir
            truststore = @config[:base] + '/config/' + config[:truststore]
          end
        else # trustore == keystore
          truststore = keystore
        end
    
        security_connector = Jetty::Security::SslSocketConnector.new
        security_connector.set_acceptors(config[:acceptor_size])
        security_connector.port = config[:port]
        security_connector.confidential_port = config[:port]
        security_connector.keystore = keystore
        security_connector.password = config[:password]
        security_connector.key_password = config[:key_password].nil? ? config[:password] : config[:key_password]
        security_connector.truststore = truststore
        security_connector.trust_password = config[:trust_pasword].nil? ? config[:password] : config[:trust_pasword]
        @server.add_connector(security_connector)
      else
        connector = Jetty::SelectChannelConnector.new
        connector.set_acceptors(config[:acceptor_size])
        connector.port = config[:port]
        connector.confidential_port = config[:security_port] if config[:security_port]
        @server.add_connector(connector)
      end
    

    how to generate a certificate store (keystore.jks)

    See here: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

    RAILS_ROOT/config/jetty_rails.yml

    # Config
    :port: 3000
    :jruby_min_runtimes: <%= config[:environment] == 'production' ? 3 : 1 %>
    :jruby_max_runtimes: <%= config[:environment] == 'production' ? 6 : 2 %>
    :thread_pool_max: 40
    :thread_pool_min: 4
    :acceptor_size: 10
    
    # Security
    :ssl: true
    :keystore: keystore.jks
    :password: your_pass
    # :key_password: your_pass # if different
    # :truststore: truststore.jks # if different
    # :trust_pasword: your_pass # if different
    

    start the server

    jruby -S jetty_rails -c config/jetty_rails.yml