класс DRb::DRbSSLSocket::SSLConfig
SSLConfig обрабатывает необходимую SSL-информацию для установления соединения DRbSSLSocket, включая генерацию пары X509/RSA.
Экземпляр этой конфигурации может быть передан в DRb::DRbSSLSocket.new, DRb::DRbSSLSocket.open и DRb::DRbSSLSocket.open_server.
См. ::new для получения более подробной информации.
Константы
Открытые методы класса
# 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
Открытые методы экземпляра
# File lib/drb/ssl.rb, line 135 def [](key); @config[key] || DEFAULT[key] end
Удобный метод для доступа к значениям, как в словаре.
# 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, с контекстом текущей конфигурации сертификата.
# 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, с контекстом текущей конфигурации сертификата.
# 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 были предоставлены или что новый сертификат генерируется с другими предоставленными параметрами.
# 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.