Spec-Zone.ru › Ruby 3.2

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

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

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

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

См. DRb::DRbSSLSocket::SSLConfig.new для получения дополнительных сведений.

Константы

DEFAULT

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

См. DRb::DRbSSLSocket::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, либо экземпляр Hash, и настроит сертификат для своей сессии в соответствии с конфигурацией. Если необходимо сгенерировать универсальный сертификат, минимально необходимо указать :SSLCertName.

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

Из хэша config:

:SSLCertificate

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

:SSLPrivateKey

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

:SSLClientCA

Сертификат OpenSSL::X509::Certificate или массив Array сертификатов, которые будут использоваться в качестве 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 не были заданы). Значение должно быть массивом Array пар:

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

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

:SSLCertComment

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

Пример

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

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

Удобный метод доступа к значениям, как в хэше Hash

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

Принять подключение к IO 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

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

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

  rsa = OpenSSL::PKey::RSA.new(2048){|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, "SHA256")

  @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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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