class 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для получения дополнительной информации.
Публичные методы класса
# File lib/drb/ssl.rb, line 135 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. - :SSLMinVersion
-
Минимальная версия SSL, разрешённая. См.
OpenSSL::SSL::SSLContext#min_version=. - :SSLMaxVersion
-
Максимальная версия SSL, разрешённая. См.
OpenSSL::SSL::SSLContext#max_version=. - :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».
Пример
Эти значения могут быть добавлены позже, как в хеше 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
Публичные методы экземпляра
# File lib/drb/ssl.rb, line 143 def [](key); @config[key] || DEFAULT[key] end
Удобный метод для доступа к значениям, как в хеше Hash.
# File lib/drb/ssl.rb, line 158 def accept(tcp) ssl = OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx) ssl.sync = true ssl.accept ssl end
Принимает подключение к IO tcp, с учётом текущей конфигурации сертификата.
# File lib/drb/ssl.rb, line 149 def connect(tcp) ssl = ::OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx) ssl.sync = true ssl.connect ssl end
Подключается к IO tcp, с учётом текущей конфигурации сертификата.
# File lib/drb/ssl.rb, line 168
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 были предоставлены или что новый сертификат сгенерирован с другими заданными параметрами.
# File lib/drb/ssl.rb, line 215 def setup_ssl_context ctx = ::OpenSSL::SSL::SSLContext.new ctx.cert = @cert ctx.key = @pkey ctx.min_version = self[:SSLMinVersion] ctx.max_version = self[:SSLMaxVersion] 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.