Spec-Zone.ru › Ruby 2.3

класс DRb::DRbSSLSocket::SSLConfig

Родитель:
Объект

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 127
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 или массив сертификатов, которые будут использоваться как ClientCA в 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

Комментарий, используемый для генерации сертификата. По умолчанию «Generated by 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 135
def [](key);
  @config[key] || DEFAULT[key]
end

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

accept(tcp) Показать исходный код
# File lib/drb/ssl.rb, line 150
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 141
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 160
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 207
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