Kami telah mengubah pengaturan default dari ext/openssl di Ruby 2.1.4, Ruby 2.0.0-p594, dan Ruby 1.9.3-p550.
Dengan perubahan ini, opsi SSL/TLS yang tidak aman saat ini dinonaktifkan secara default.
Namun, dengan adanya perubahan ini, terdapat sebuah kemungkinan adanya masalah dalam koneksi SSL.

## Detil

OpenSSL masih menerapkan protokol dan cipher yang dianggap tidak aman saat ini dari keadaan historisnya.
Seperti celah keamanan POODLE ([CVE-2014-3566](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566)), jika Anda tetap menggunakan OpenSSL dengan fitur yang tidak aman tersebut, Anda mungkin tidak dapat menjaga keamanan jaringan komunikasi.
Jadi, berdasarkan diskusi di [Bug #9424](https://bugs.ruby-lang.org/issues/9424), kami harus memutuskan untuk menonaktifkan opsi tidak aman SSL/TLS tersebut secara default.
Jika anda perlu membatalkan perubahan ini (tersedia dibawah), terapkan patch reverse untuk mencabutnya.

2.1.4
: [r48098](https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=48098&view=revision)

2.0.0-p594
: [r48110](https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=48110&view=revision)

1.9.3-p550
: [r48121](https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=48121&view=revision)

Meski begitu, jika Anda membatalkan perubahan ini, terdapat risiko dimana Anda tidak dapat menjamin keamanan jaringan komunikasi.
Anda harus memahami implikasi dari perubahan ini sebelum menghilangkannya.

### Kumpulan library - library dari Ruby

Perubahan ini terlihat di dalam net/http, net/imap, dan net/pop.
Semenjak DRb dan WEBrick mendapat pengaturan terpisah, perubahan ini tidak memiliki efek terhadap keduanya.

### Script yang menggunakan secara langsung ext/openssl

Perubahan ini dapat terlihat ketika sebuah instance dari object `OpenSSL::SSL::SSLContext` dibuat dan instance method yang bernama `set_params` dipanggil.

Khususnya, kode seperti berikut:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">ctx</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">SSLContext</span><span class="p">.</span><span class="nf">new</span>
<span class="n">ctx</span><span class="p">.</span><span class="nf">set_params</span>  <span class="c1"># Jika Anda ingin mengubah beberapa opsi seperti cert store, verify mode dan lain - lain, Anda dapat mengirimkan parameter tersebut dalam sebuah hash.</span>
<span class="n">ssl</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">SSLSocket</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">socket</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span></code></pre></figure>

Ketika menggunakan ext/openssl sebagai sebuah client side, kami berasumsi bahwa mungkin tidak ada masalah dengan perubahan ini.
Namun, jika Anda menggunakan ext/openssl sebagai sebuah server side dan menyesuaikan dengan perubahan ini, beberapa old client(Internet Explorer 6 di Windows XP, browser - browser di ponsel tua, dan lain - lain.) mungkin tidak dapat melakukan koneksi ke server.

Keputusan ada di tangan Anda untuk mengaktifkan perubahan ini atau tidak, mohon perhatikan trade-off masing - masing pilihan.

## Solusi

Jika Anda tidak dapat melakukan update Ruby tetapi harus mengatasi opsi tidak aman SSL/TLS, terapkan monkey-patch berikut:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">module</span> <span class="nn">OpenSSL</span>
  <span class="k">module</span> <span class="nn">SSL</span>
    <span class="k">class</span> <span class="nc">SSLContext</span>
      <span class="n">remove_const</span><span class="p">(</span><span class="ss">:DEFAULT_PARAMS</span><span class="p">)</span>
      <span class="no">DEFAULT_PARAMS</span> <span class="o">=</span> <span class="p">{</span>
        <span class="ss">:ssl_version</span> <span class="o">=&gt;</span> <span class="s2">"SSLv23"</span><span class="p">,</span>
        <span class="ss">:verify_mode</span> <span class="o">=&gt;</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">VERIFY_PEER</span><span class="p">,</span>
        <span class="ss">:ciphers</span> <span class="o">=&gt;</span> <span class="sx">%w{
          ECDHE-ECDSA-AES128-GCM-SHA256
          ECDHE-RSA-AES128-GCM-SHA256
          ECDHE-ECDSA-AES256-GCM-SHA384
          ECDHE-RSA-AES256-GCM-SHA384
          DHE-RSA-AES128-GCM-SHA256
          DHE-DSS-AES128-GCM-SHA256
          DHE-RSA-AES256-GCM-SHA384
          DHE-DSS-AES256-GCM-SHA384
          ECDHE-ECDSA-AES128-SHA256
          ECDHE-RSA-AES128-SHA256
          ECDHE-ECDSA-AES128-SHA
          ECDHE-RSA-AES128-SHA
          ECDHE-ECDSA-AES256-SHA384
          ECDHE-RSA-AES256-SHA384
          ECDHE-ECDSA-AES256-SHA
          ECDHE-RSA-AES256-SHA
          DHE-RSA-AES128-SHA256
          DHE-RSA-AES256-SHA256
          DHE-RSA-AES128-SHA
          DHE-RSA-AES256-SHA
          DHE-DSS-AES128-SHA256
          DHE-DSS-AES256-SHA256
          DHE-DSS-AES128-SHA
          DHE-DSS-AES256-SHA
          AES128-GCM-SHA256
          AES256-GCM-SHA384
          AES128-SHA256
          AES256-SHA256
          AES128-SHA
          AES256-SHA
          ECDHE-ECDSA-RC4-SHA
          ECDHE-RSA-RC4-SHA
          RC4-SHA
        }</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">":"</span><span class="p">),</span>
        <span class="ss">:options</span> <span class="o">=&gt;</span> <span class="o">-&gt;</span> <span class="p">{</span>
          <span class="n">opts</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_ALL</span>
          <span class="n">opts</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_DONT_INSERT_EMPTY_FRAGMENTS</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_DONT_INSERT_EMPTY_FRAGMENTS</span><span class="p">)</span>
          <span class="n">opts</span> <span class="o">|=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_COMPRESSION</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_COMPRESSION</span><span class="p">)</span>
          <span class="n">opts</span> <span class="o">|=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv2</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv2</span><span class="p">)</span>
          <span class="n">opts</span> <span class="o">|=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv3</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv3</span><span class="p">)</span>
          <span class="n">opts</span>
        <span class="p">}.</span><span class="nf">call</span>
      <span class="p">}</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

## Versi - versi yang terpengaruh terhadap perubahan ini

* Ruby 1.9.3 patchlevel 550 dan selanjutnya
* Ruby 2.0.0 patchlevel 594 dan selanjutnya
* Ruby 2.1.4 dan selanjutnya
* revision 48097 dan trunk selanjutnya

## Histori

* Awal diterbitkan pada 2014-10-27 12:00:00 (UTC)
