Spec-Zone.ru › Ruby 2.2

class DRb::DRbSSLSocket::SSLConfig

Parent:
Объект

SSLConfig обрабатывает необходимую SSL-информацию для установления соединения DRbSSLSocket, включая генерацию пары X509 / RSA.

Экземпляр этой конфигурации можно передать в DRb::DRbSSLSocket.new, DRb::DRbSSLSocket.open и DRb::DRbSSLSocket.open_server.

См. ::new для получения дополнительной информации.

Константы

DEFAULT

Значения по умолчанию для экземпляра SSLConfig.

См. ::new для получения дополнительной информации.

Публичные методы класса

new(config) Показать исходный код
# File lib/drb/ssl.rb, line 126
def initialize(config)
  @config  = config
  @cert    = config[:SSLCertificate]
  @pkey    = config[:SSLPrivateKey]
  @ssl_ctx = nil
end

Создать новый экземпляр DRb::DRbSSLSocket::SSLConfig.

DRb::DRbSSLSocket примет либо config словарь, либо экземпляр SSLConfig и настроит сертификат для сеанса в соответствии с конфигурацией. Если нужно сгенерировать универсальный сертификат, необходимо указать как минимум :SSLCertName.

Параметры конфигурации

Из config словаря:

:SSLCertificate

Экземпляр OpenSSL::X509::Certificate. Если он не указан, генерируется универсальный X509 с соответствующим :SSLPrivateKey.

:SSLPrivateKey

Экземпляр закрытого ключа, например, OpenSSL::PKey::RSA. Этот ключ должен быть ключом, подписавшим :SSLCertificate.

:SSLClientCA

OpenSSL::X509::Certificate или массив сертификатов, которые будут использоваться в качестве ClientCAs в SSL-контексте.

:SSLCACertificatePath

Путь к каталогу сертификатов CA. Сертификаты должны быть в формате PEM.

:SSLCACertificateFile

Путь к файлу сертификата CA в формате PEM.

:SSLTmpDhCallback

Обратный вызов DH. См. OpenSSL::SSL::SSLContext#tmp_dh_callback.

:SSLVerifyMode

Режим проверки SSL. См. OpenSSL::SSL::VERIFY_* для доступных режимов. По умолчанию OpenSSL::SSL::VERIFY_NONE.

:SSLVerifyDepth

Количество сертификатов CA, которые нужно пройти при проверке цепочки сертификатов.

:SSLVerifyCallback

Обратный вызов для дополнительной проверки. См. OpenSSL::SSL::SSLContext#verify_callback.

:SSLCertificateStore

OpenSSL::X509::Store, используемый для проверки сертификатов.

:SSLCertName

Имя издателя сертификата. Требуется при генерации сертификата (если :SSLCertificate и :SSLPrivateKey не были указаны). Значение должно быть массивом пар:

[["C", "Raleigh"], ["ST","North Carolina"],
 ["CN","fqdn.example.com"]]

См. также OpenSSL::X509::Name.

:SSLCertComment

Комментарий, используемый при генерации сертификата. По умолчанию «Сгенерировано Ruby/OpenSSL».

Пример

Эти значения могут быть добавлены позже, как в словаре.

require 'drb/ssl'
c = DRb::DRbSSLSocket::SSLConfig.new {}
c[:SSLCertificate] =
  OpenSSL::X509::Certificate.new(File.read('mycert.crt'))
c[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(File.read('mycert.key'))
c[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER
c[:SSLCACertificatePath] = "/etc/ssl/certs/"
c.setup_certificate

или

require 'drb/ssl'
c = DRb::DRbSSLSocket::SSLConfig.new({
        :SSLCertName => [["CN" => DRb::DRbSSLSocket.getservername]]
        })
c.setup_certificate

Публичные методы экземпляра

[](key) Показать исходный код
# File lib/drb/ssl.rb, line 134
def [](key);
  @config[key] || DEFAULT[key]
end

Метод для удобного доступа к значениям, как в словаре.

accept(tcp) Показать исходный код
# File lib/drb/ssl.rb, line 149
def accept(tcp)
  ssl = OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx)
  ssl.sync = true
  ssl.accept
  ssl
end

Принять соединение с потоком ввода-вывода tcp, с учетом текущей конфигурации сертификата.

connect(tcp) Показать исходный код
# File lib/drb/ssl.rb, line 140
def connect(tcp)
  ssl = ::OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx)
  ssl.sync = true
  ssl.connect
  ssl
end

Подключиться к потоку ввода-вывода tcp, с учетом текущей конфигурации сертификата.

setup_certificate() Показать исходный код
# File lib/drb/ssl.rb, line 159
def setup_certificate
  if @cert && @pkey
    return
  end

  rsa = OpenSSL::PKey::RSA.new(1024){|p, n|
    next unless self[:verbose]
    case p
    when 0; $stderr.putc "."  # BN_generate_prime
    when 1; $stderr.putc "+"  # BN_generate_prime
    when 2; $stderr.putc "*"  # searching good prime,
                              # n = #of try,
                              # but also data from BN_generate_prime
    when 3; $stderr.putc "\n" # found good prime, n==0 - p, n==1 - q,
                              # but also data from BN_generate_prime
    else;   $stderr.putc "*"  # BN_generate_prime
    end
  }

  cert = OpenSSL::X509::Certificate.new
  cert.version = 3
  cert.serial = 0
  name = OpenSSL::X509::Name.new(self[:SSLCertName])
  cert.subject = name
  cert.issuer = name
  cert.not_before = Time.now
  cert.not_after = Time.now + (365*24*60*60)
  cert.public_key = rsa.public_key

  ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
  cert.extensions = [
    ef.create_extension("basicConstraints","CA:FALSE"),
    ef.create_extension("subjectKeyIdentifier", "hash") ]
  ef.issuer_certificate = cert
  cert.add_extension(ef.create_extension("authorityKeyIdentifier",
                                         "keyid:always,issuer:always"))
  if comment = self[:SSLCertComment]
    cert.add_extension(ef.create_extension("nsComment", comment))
  end
  cert.sign(rsa, OpenSSL::Digest::SHA1.new)

  @cert = cert
  @pkey = rsa
end

Обеспечивает, что :SSLCertificate и :SSLPrivateKey были предоставлены или что новый сертификат сгенерирован с другими предоставленными параметрами.

setup_ssl_context() Показать исходный код
# File lib/drb/ssl.rb, line 206
def setup_ssl_context
  ctx = ::OpenSSL::SSL::SSLContext.new
  ctx.cert            = @cert
  ctx.key             = @pkey
  ctx.client_ca       = self[:SSLClientCA]
  ctx.ca_path         = self[:SSLCACertificatePath]
  ctx.ca_file         = self[:SSLCACertificateFile]
  ctx.tmp_dh_callback = self[:SSLTmpDhCallback]
  ctx.verify_mode     = self[:SSLVerifyMode]
  ctx.verify_depth    = self[:SSLVerifyDepth]
  ctx.verify_callback = self[:SSLVerifyCallback]
  ctx.cert_store      = self[:SSLCertificateStore]
  @ssl_ctx = ctx
end

Установить OpenSSL::SSL::SSLContext с предоставленными параметрами конфигурации.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API