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 127 def initialize(config) @config = config @cert = config[:SSLCertificate] @pkey = config[:SSLPrivateKey] @ssl_ctx = nil end
Создать новый экземпляр DRb::DRbSSLSocket::SSLConfig
DRb::DRbSSLSocket примет либо config Hash, либо экземпляр SSLConfig и настроит сертификат для сеанса конфигурации. Если нужно сгенерировать универсальный сертификат, минимум - предоставить :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
-
Комментарий, используемый для генерации сертификата. По умолчанию «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 135 def [](key); @config[key] || DEFAULT[key] end
Удобный метод доступа к значениям, как в Hash
# 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, с контекстом текущей конфигурации сертификата
# 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, с контекстом текущей конфигурации сертификата
# 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, OpenSSL::Digest::SHA256.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.