首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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)。这个值是一对数组:

代码语言:javascript
复制
[["C", "Raleigh"], ["ST","North Carolina"],
 ["CN","fqdn.example.com"]]

:SSLCertComment

用于生成证书的注释。默认值是“由Ruby / OpenSSL生成”

这些值可以在事后添加,如哈希。

代码语言:javascript
复制
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

或者

代码语言:javascript
复制
require 'drb/ssl'
c = DRb::DRbSSLSocket::SSLConfig.new({
        :SSLCertName => [["CN" => DRb::DRbSSLSocket.getservername]]
        })
c.setup_certificate
代码语言:javascript
复制
# File lib/drb/ssl.rb, line 126
def initialize(config)
  @config  = config
  @cert    = config[:SSLCertificate]
  @pkey    = config[:SSLPrivateKey]
  @ssl_ctx = nil
end

公共实例方法

显示来源

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

代码语言:javascript
复制
# File lib/drb/ssl.rb, line 134
def [](key);
  @config[key] || DEFAULT[key]
end

接受(tcp)显示源

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

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# 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或使用提供的其他参数生成新证书。

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
# 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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com