当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Certificate类用法及代码示例


本文简要介绍ruby语言中 OpenSSL::X509::Certificate类 的用法。

RFC 5280 中指定的 X.509 证书的实现。提供对证书属性的访问并允许从字符串中读取证书,但也支持从头开始创建新证书。

从文件中读取证书

Certificate 能够处理 DER-encoded 证书和以 OpenSSL 的 PEM 格式编码的证书。

raw = File.binread "cert.cer" # DER- or PEM-encoded
certificate = OpenSSL::X509::Certificate.new raw

将证书保存到文件

证书可以以 DER 格式编码

cert = ...
File.open("cert.cer", "wb") { |f| f.print cert.to_der }

或 PEM 格式

cert = ...
File.open("cert.pem", "wb") { |f| f.print cert.to_pem }

X.509 证书与私钥/公钥对相关联,通常是 RSA、DSA 或 ECC key (另请参见 OpenSSL::PKey::RSA OpenSSL::PKey::DSA OpenSSL::PKey::EC ),公钥本身存储在证书中并且可以以 OpenSSL::PKey 的形式访问。证书通常用于能够将某种形式的身份与 key 对相关联,例如,通过 HTTPs 提供页面的 Web 服务器使用证书向用户验证自己的身份。

公钥基础设施 (PKI) 模型依赖于颁发这些证书的受信任的证书颁发机构 (“root CAs”),因此最终用户只需将信任建立在选定的少数颁发机构上,这些颁发机构自己再次担保从属 CA 颁发其证书以结束用户。

OpenSSL::X509 模块提供了设置独立 PKI 的工具,类似于使用 ‘openssl’ 命令行工具在私有 PKI 中颁发证书的场景。

创建根 CA 证书和 end-entity 证书

首先,我们需要创建一个“self-signed” 根证书。为此,我们需要先生成一个 key 。请注意,选择“1” 作为序列号被认为是真实证书的安全漏洞。安全选择是两位字节范围内的整数,理想情况下不是连续的而是安全的随机数,此处省略步骤以保持示例简洁。

root_key = OpenSSL::PKey::RSA.new 2048 # the CA's public/private key
root_ca = OpenSSL::X509::Certificate.new
root_ca.version = 2 # cf. RFC 5280 - to make it a "v3" certificate
root_ca.serial = 1
root_ca.subject = OpenSSL::X509::Name.parse "/DC=org/DC=ruby-lang/CN=Ruby CA"
root_ca.issuer = root_ca.subject # root CA's are "self-signed"
root_ca.public_key = root_key.public_key
root_ca.not_before = Time.now
root_ca.not_after = root_ca.not_before + 2 * 365 * 24 * 60 * 60 # 2 years validity
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = root_ca
ef.issuer_certificate = root_ca
root_ca.add_extension(ef.create_extension("basicConstraints","CA:TRUE",true))
root_ca.add_extension(ef.create_extension("keyUsage","keyCertSign, cRLSign", true))
root_ca.add_extension(ef.create_extension("subjectKeyIdentifier","hash",false))
root_ca.add_extension(ef.create_extension("authorityKeyIdentifier","keyid:always",false))
root_ca.sign(root_key, OpenSSL::Digest.new('SHA256'))

下一步是使用根 CA 证书创建 end-entity 证书。

key = OpenSSL::PKey::RSA.new 2048
cert = OpenSSL::X509::Certificate.new
cert.version = 2
cert.serial = 2
cert.subject = OpenSSL::X509::Name.parse "/DC=org/DC=ruby-lang/CN=Ruby certificate"
cert.issuer = root_ca.subject # root CA is the issuer
cert.public_key = key.public_key
cert.not_before = Time.now
cert.not_after = cert.not_before + 1 * 365 * 24 * 60 * 60 # 1 years validity
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = cert
ef.issuer_certificate = root_ca
cert.add_extension(ef.create_extension("keyUsage","digitalSignature", true))
cert.add_extension(ef.create_extension("subjectKeyIdentifier","hash",false))
cert.sign(root_key, OpenSSL::Digest.new('SHA256'))

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Certificate类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。