建一个私有证书颁发机构

建一个私有证书颁发机构

建一个私有证书颁发机构

如果要设置自己的CA,则所需的一切都已包含在OpenSSL中。 用户界面纯粹是基于命令行的,因此用户界面不是很友好,但这可能会变得更好。 整个过程非常具有教育意义,因为它会迫使您考虑各个方面,甚至是最小的细节。

根CA配置

在实际创建CA之前,我们需要准备一个配置文件(root-ca.conf),该文件将完全告诉OpenSSL我们如何进行设置。在正常使用过程中,大多数时候不需要配置文件,但是对于复杂的操作(例如创建根CA)而言,配置文件是必不可少的。 OpenSSL配置文件功能强大; 在继续之前,我建议您熟悉它们的功能(命令行上的man config)。

配置文件的第一部分包含一些基本的CA信息,例如名称和基本URL,以及CA专有名称的组成部分。 因为语法是灵活的,所以仅需要提供一次信息:

[default]
name = root-ca
domain_suffix = example.com
aia_url = http://$name.$domain_suffix/$name.crt
crl_url = http://$name.$domain_suffix/$name.crl
ocsp_url = http://ocsp.$name.$domain_suffix:9080
default_ca = ca_default
name_opt = utf8,esc_ctrl,multiline,lname,align
[ca_dn]
countryName = "GB"
organizationName = "Example"
commonName = "Root CA"

第二部分直接控制CA的操作。 有关每个设置的完整信息,请查阅ca命令的文档(命令行中的man ca)。 大多数设置是不言自明的; 我们通常会告诉OpenSSL我们要将文件保存在何处。 因为此根CA仅将用于颁发从属CA,所以我选择使证书的有效期为10年。 对于签名算法,安全SHA256用于默认。 配置默认策略(policy_c_o_match),以便从此CA颁发的所有证书都具有与CA匹配的countryName和organizationalName字段。 通常,这不是由公共CA来完成的,但对于私有CA是合适的:

[ca_default]
home = .
database = $home/db/index
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/$name.crt
private_key = $home/private/$name.key
RANDFILE = $home/private/random
new_certs_dir = $home/certs
unique_subject = no
copy_extensions = none
default_days = 3650
default_crl_days = 365
default_md = sha256
policy = policy_c_o_match
[policy_c_o_match]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

第三部分包含req命令的配置,该命令在创建自签名根证书期间将仅使用一次。 最重要的部分在扩展中:basicConstraints扩展指示证书是CA,并且keyUsage包含此方案的适当设置:

[req]
default_bits = 4096
encrypt_key = yes
default_md = sha256
utf8 = yes
string_mask = utf8only
prompt = no
distinguished_name = ca_dn
req_extensions = ca_ext
[ca_ext]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash

配置文件的第四部分包含在根CA颁发的证书的构造过程中将使用的信息。如basicConstraints扩展所示,所有证书都将是CA,但是我们将pathlen设置为零,这意味着
下级CA是不允许的。
所有下级CA都将受到约束,这意味着它们颁发的证书仅对一部分域名和受限用途有效。首先,扩展KeyUsage扩展仅指定clientAuth和serverAuth,这是TLS客户端和服务器身份验证。其次,nameConstraints扩展名将允许的主机名仅限制为example.com和example.org域名。从理论上讲,此设置使您可以控制
通过下级CA传递给其他CA,但仍然可以放心,它们不能为任意主机名颁发证书。如果需要,可以将每个从属CA限制为一个小型域名称空间。排除这两个IP地址范围的要求来自CA / Browser论坛的基准要求,其中定义了技术上受限制的从属CA的定义。实际上,名称约束并不完全可行,因为某些主要平台目前尚无法识别nameConstraints扩大。如果您将此扩展标记为关键,则此类平台将拒绝您的证书。如果您不将其标记为关键,则不会有此类问题(如示例中所示),但是其他一些平台则不会强制实施。

[sub_ca_ext]
authorityInfoAccess = @issuer_info
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:true,pathlen:0
crlDistributionPoints = @crl_info
extendedKeyUsage = clientAuth,serverAuth
keyUsage = critical,keyCertSign,cRLSign
nameConstraints = @name_constraints
subjectKeyIdentifier = hash
[crl_info]
URI.0 = $crl_url
[issuer_info]
caIssuers;URI.0 = $aia_url
OCSP;URI.0 = $ocsp_url
[name_constraints]
permitted;DNS.0=example.com
permitted;DNS.1=example.org
excluded;IP.0=0.0.0.0/0.0.0.0
excluded;IP.1=0:0:0:0:0:0:0:0/0:0:0:0:0:0:0:0

该配置的第五部分(也是最后一部分)指定了与OCSP响应签名证书一起使用的扩展。 为了能够运行OCSP响应程序,我们生成了一个特殊的证书并将OCSP签名功能委托给它。 该证书不是CA,您可以从扩展名中看到:

[ocsp_ext]
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:false
extendedKeyUsage = OCSPSigning
keyUsage = critical,digitalSignature
subjectKeyIdentifier = hash

根CA目录结构

下一步是创建上一部分中指定的目录结构,并初始化将在CA操作期间使用的一些文件:

$ mkdir root-ca
$ cd root-ca
$ mkdir certs db private
$ chmod 700 private
$ touch db/index
$ openssl rand -hex 16 > db/serial
$ echo 1001 > db/crlnumber

使用了以下子目录:

certs/

证书存储; 新证书将在颁发时放置在此处。

Db/

此目录用于证书数据库(索引)和保存证书的文件。下一份证书和CRL序列号。 OpenSSL将创建一些其他需要的文件。

private/

该目录将存储私钥,一个私钥用于CA,另一个私钥用于OCSP响应者。 重要的是,没有其他用户可以访问它。 (实际上,如果您要认真对待CA,则用于存储根材料的计算机应仅具有最少数量的用户帐户。)

根CA生成

我们采取两个步骤来创建根CA。 首先,我们生成密钥和CSR。 使用-config开关时,将从配置文件中提取所有必要的信息:

$ openssl req -new \
    -config root-ca.conf \
    -out root-ca.csr \
    -keyout private/root-ca.key

在第二步中,我们创建一个自签名证书。 -extensions开关指向配置文件中的ca_ext部分,该文件激活适用于根CA的扩展名:

$ openssl ca -selfsign \
      -config root-ca.conf \
      -in root-ca.csr \
      -out root-ca.crt \
       -extensions ca_ext

数据库文件的结构

db/index中的数据库是一个纯文本文件,其中包含证书信息,一个证书每行。 在根CA创建之后,它应仅包含一行:

V 240706115345Z 1001 unknown /C=GB/O=Example/CN=Root CA

每行包含六个值,这些值由制表符分隔:

1.状态标志(V表示有效,R表示撤销,E表示过期)

2.到期日期(格式为YYMMDDHHMMSSZ)

3.撤消日期;如果未撤消,则为空

4.序列号(十六进制)

5.文件位置或未知(未知)

6.专有名称

根CA操作

要从新CA生成CRL,请使用ca命令的-gencrl开关:

$ openssl ca -gencrl \
        -config root-ca.conf \
        -out root-ca.crl

要颁发证书,请使用所需参数调用ca命令。 重要的是-extensions开关指向配置文件中的正确部分(例如,您不想创建另一个根CA)。


$ openssl ca \
    -config root-ca.conf \
    -in sub-ca.csr \
    -out sub-ca.crt \
    -extensions sub_ca_ext

要撤消证书,请使用ca命令的-revoke开关;否则,请执行以下操作。 您需要拥有要撤销的证书的副本。 因为所有证书都存储在certs/目录中,所以您只需要知道序列号即可。 如果您有一个专有名称,则可以在数据库中查找序列号。

在-crl_reason开关中为该值选择正确的原因。 该值可以是以下值之一:unspecified, keyCompromise, CACompromise, affiliationChanged, superseded, cessationOfOperation, certificateHold, and removeFromCRL.

$ openssl ca \
    -config root-ca.conf \
    -revoke certs/1002.pem \
    -crl_reason keyCompromise

创建用于OCSP签名的证书

首先,我们为OCSP响应者创建密钥和CSR。 与任何非CA证书一样,完成了这两项操作,因此我们不指定配置文件:

$ openssl req -new \
    -newkey rsa:2048 \
    -subj "/C=GB/O=Example/CN=OCSP Root Responder" \
    -keyout private/root-ocsp.key \
    -out root-ocsp.csr

其次,使用根CA颁发证书。 -extensions开关的值指定ocsp_ext,以确保设置了适合OCSP签名的扩展名。 我将新证书的生命周期从默认的3,650天减少到了365天。 由于这些OCSP证书不包含吊销信息,因此无法吊销它们。 因此,您希望使寿命尽可能短。 一个不错的选择是30天,前提是您准备好生成经常会出现以下情况的新证书:

$ openssl ca \
    -config root-ca.conf \
    -in root-ocsp.csr \
    -out root-ocsp.crt \
    -extensions ocsp_ext \
    -days 30

现在,您已准备就绪,可以启动OCSP响应程序。 为了进行测试,可以从根CA所在的同一台计算机上进行测试。 但是,对于生产,您必须将OCSP响应程序密钥和证书移至其他位置:

$ openssl ocsp \
    -port 9080
    -index db/index \
    -rsigner root-ocsp.crt \
    -rkey private/root-ocsp.key \
    -CA root-ca.crt \
    -text

您可以使用以下命令行测试OCSP响应程序的操作:

$ openssl ocsp \
    -issuer root-ca.crt \
    -CAfile root-ca.crt \
    -cert root-ocsp.crt \
    -url http://127.0.0.1:9080

在输出中,verify OK表示签名已正确验证,good表示证书尚未撤消。

Response verify OK
root-ocsp.crt: good
This Update: Jul 9 18:45:34 2014 GMT
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值