Ruby 2.4

DRb::DRbSSLSocket::SSLConfig

class DRb::DRbSSLSocket::SSLConfig

Parent:Object

SSLConfig处理所需的SSL信息以建立DRbSSLSocket连接,包括生成X509 / RSA对。

该配置的一个实例可以传递给DRb :: DRbSSLSocket.new,DRb :: DRbSSLSocket.open和DRb :: DRbSSLSocket.open_server

详情请参阅:: new

常量

DEFAULT

SSLConfig实例的默认值。

详情请参阅:: new

公共类方法

new(config)显示源

创建一个新的DRb :: DRbSSLSocket :: SSLConfig实例

DRb :: DRbSSLSocket将采用config哈希或SSLConfig的实例,并将为其配置的会话设置证书。如果希望它生成一个通用证书,则最低限度是提供:SSLCertName

配置选项

config哈希:

:SSLCertificate

OpenSSL :: X509 :: Certificate的一个实例。如果没有提供,则生成一个通用的X509,并带有相应的:SSLPrivateKey

:SSLPrivateKey

私钥实例,如OpenSSL :: PKey :: RSA。该密钥必须是签署:SSLCertificate的密钥

:SSLClientCA

一个OpenSSL :: X509 ::证书或将在SSL上下文中用作ClientCAs的证书数组

:SSLCACertificatePath

CA证书目录的路径。证书必须采用PEM格式。

:SSLCACertificateFile

以PEM格式指向CA证书文件的路径。

: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"]]

:SSLCertComment

用于生成证书的注释。默认值是“由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 126 def initialize(config) @config = config @cert = config[:SSLCertificate] @pkey = config[:SSLPrivateKey] @ssl_ctx = nil end

公共实例方法

显示来源

一种方便的方法来访问像哈希这样的值

# File lib/drb/ssl.rb, line 134 def [](key @config[key] || DEFAULT[key] end

接受(tcp)显示源

接受与IO的连接tcp,以及当前证书配置的上下文

# File lib/drb/ssl.rb, line 149 def accept(tcp) ssl = OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx) ssl.sync = true ssl.accept ssl end

连接(tcp)显示源

tcp使用当前证书配置的上下文连接到IO

# File lib/drb/ssl.rb, line 140 def connect(tcp) ssl = ::OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx) ssl.sync = true ssl.connect ssl end

setup_certificate()显示源文件

确保:已提供SSLCertificate和:SSLPrivateKey或使用提供的其他参数生成新证书。

# File lib/drb/ssl.rb, line 159 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

setup_ssl_context()显示源文件

使用提供的配置参数建立OpenSSL :: SSL :: SSLContext。

# File lib/drb/ssl.rb, line 206 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