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