ext/openssl의 기본 설정 변경

루비 2.1.4, 루비 2.0.0-p594, 루비 1.9.3-p550에서 ext/openssl의 기본 설정을 변경하였습니다. 이 수정으로 안전하지 않은 SSL/TLS 옵션이 꺼짐이 기본값이 됩니다. 하지만, 이 수정은 SSL 연결에 문제를 일으킬 수도 있습니다.

상세 정보

OpenSSL은 여전히 프로토콜과 암호를 구현 중이고, 역사적 상황에 의해 지금도 안전하지 않은 것으로 간주됩니다. POODLE 취약점(CVE-2014-3566) 같은, OpenSSL의 안전하지 않은 기능을 계속 사용할 경우, 네트워크 통신의 안전을 유지하지 못할 수도 있습니다. 그래서, Bug #9424에서 한 토론을 바탕으로, 안전하지 않은 SSL/TLS 옵션을 꺼짐을 기본으로 변경하기로 결정했습니다. 이 수정(밑의 링크)을 되돌릴 필요가 있다면, 리버스 패치를 적용하세요.

2.1.4
r48098
2.0.0-p594
r48110
1.9.3-p550
r48121

하지만, 이 수정을 되돌린다면, 네트워크의 안전을 보장할 수 없는 위험이있습니다. 당신은 이 변경을 되돌리기 전에 그 점을 숙지하셔야 합니다.

루비에 포함된 라이브러리들

이 변경은 net/http, net/imap, net/pop에 반영됩니다. DRb와 WEBrick은 별도의 설정을 사용하기 떄문에, 영향받지 않습니다.

ext/openssl을 직접 사용하는 스크립트

이 변경은 OpenSSL::SSL::SSLContext 객체가 객체화될 때와 인스턴스 메소드 set_params가 불릴 때 반영됩니다.

예를 들면, 이런 코드입니다.

ctx = OpenSSL::SSL::SSLContext.new
ctx.set_params  # 인증서 저장소나 확인 모드 같은 몇몇 옵션을 변경하려면, 매개 변수를 해시로 넘길 수 있습니다.
ssl = OpenSSL::SSL::SSLSocket.new(socket, ctx)

ext/openssl을 클라이언트 측에서 사용하는 경우, 이 변화가 아무런 문제가 없을 수도 있다고 생각합니다. 하지만, ext/openssl을 서버 측에서 사용하고 이 수정이 반영된다면, 일부 오래된 클라이언트(윈도우 XP의 인터넷 익스플로러 6, 오래된 휴대폰의 브라우저 등)는 서버에 접속할 수 없을 수도 있습니다.

이 설정을 켤지 끌지는 당신의 선택입니다. 트레이드 오프를 생각해 보세요.

해결 방법

루비를 업데이트할 수 없지만, 안전하지 않은 SSL/TLS 옵션에 대처해야 한다면, 이 몽키 패치를 적용하세요.

module OpenSSL
  module SSL
    class SSLContext
      remove_const(:DEFAULT_PARAMS)
      DEFAULT_PARAMS = {
        :ssl_version => "SSLv23",
        :verify_mode => OpenSSL::SSL::VERIFY_PEER,
        :ciphers => %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
        }.join(":"),
        :options => -> {
          opts = OpenSSL::SSL::OP_ALL
          opts &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS)
          opts |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
          opts |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2)
          opts |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3)
          opts
        }.call
      }
    end
  end
end

이 수정에 영향 받는 버전

  • 루비 1.9.3 패치레벨 550 이후의 버전
  • 루비 2.0.0 패치레벨 594 이후의 버전
  • 루비 2.1.4 이후의 버전
  • 리비전 48097 이후의 트렁크

수정 이력

  • 2014-10-27 12:00:00 (UTC) 최초 공개