8

I need to create an SSLSocket in Ruby 1.8+ to talk to an encrypted service. I want to set SSL options on the SSLContext object (it eventually calls SSL_CTX_set_options in the underlying OpenSSL library). I am not seeing any obvious way to do this.

This is using the OpenSSL::SSL::SSLContext interface.

As a point of reference, this is analogous to calling the set_options() in Python's pyOpenSSL library.

jww
  • 97,681
  • 90
  • 411
  • 885
shreddd
  • 10,975
  • 9
  • 33
  • 34

2 Answers2

5

Example:

ctx = OpenSSL::SSL::SSLContext.new

ctx.set_params(:options => OpenSSL::SSL::OP_EPHEMERAL_RSA | OpenSSL::SSL::OP_NO_SSLv2)
# or
ctx.options = OpenSSL::SSL::OP_EPHEMERAL_RSA | OpenSSL::SSL::OP_NO_SSLv2
qerub
  • 1,526
  • 16
  • 11
  • Nice example. It beats the snot out of what the Ruby docs are providing. How do you attach the context to an `http` when `http.use_ssl = true`? – jww Jun 16 '14 at 08:43
  • @jww: Seems like there's no API for that yet: https://bugs.ruby-lang.org/issues/9450 *sigh* – qerub Jun 16 '14 at 12:15
0

If you need to set OpenSSL::SSL::SSLContext options before request you can do it in this way:


    # Set options that you need
    OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] |= OpenSSL::SSL::OP_LEGACY_SERVER_CONNECT

    # Make a request
    uri = URI('https://example.com')
    res = Net::HTTP.post(uri, {}.to_json)

    # Unset options
    OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] &= ~OpenSSL::SSL::OP_LEGACY_SERVER_CONNECT

Anton Kachan
  • 289
  • 4
  • 6