Skip to content

Latest commit

 

History

History
390 lines (270 loc) · 18.6 KB

86.6、openssl ca.adoc

File metadata and controls

390 lines (270 loc) · 18.6 KB

ca

名称

openssl-ca, ca - 最小化 CA 应用样例

描述

ca 命令时最小化的 CA 应用。它可以被用于为各种样式的证书请求签名,以及生成证书吊销列表(CRL)。它也会维护一个文本数据库,用来记录签发的证书和它们的状态。
选项会以它们的作用分类。

选项

-help

打印使用信息。

-verbose

打印正在被执行的操作的细节。

-config filename

允许指定一个替代的配置文件。额外的,了解默认值的描述,参阅 openssl(1) 的 “COMMAND SUMMARY”

-name section

指定要使用的配置文件段(覆盖 ca 段的 default_ca)。

-in filename

一个输入文件的文件名,其中包含了单个要被 CA 签名的证书请求。

-ss_cert filename

单个将被 CA 自签名的证书。

-spkac filename

将被 CA 签名的一个文件,文件中包含单个 Netscape 签名的公钥、挑战码和额外的字段值。参见 SPKAC FORMAT 段了解输入请求和输出格式的信息。

-infiles

若设置则应出现在选项尾部,所有后续的每个参数均会作为包含了证书请求的文件的名称。

-out filename

输出的证书要输出的文件。默认值为标准输出。证书的细节会一同以 PEM 格式(除非指定了 -spkac,此时会输出 DER 格式)打印至该文件。

-outdir directory

输出的证书要输出的文件夹。证书将写入一个文件,该文件的文件名由十六进制的序列号以及后缀 .pem 组成。

-cert

CA 证书文件。

-keyfile filename

用于签名请求的私钥。

-keyform PEM|DER

私钥文件中数据的格式。默认为 PEM。

-sigopt nm:v

在签名以及验证操作中,传递给签名算法的选项。这些选项的名称和值均是算法特定的。

-key password

用于加密私钥的密码。鉴于一些系统的命令行参数是可见的(比如在 Unix 系统上的 ps 工具),该选项应该小心使用。

-selfsign

指出签发的证书的密钥(用 -keyfile 指定的)应与证书请求所使用的密钥相同。使用不同密钥签名的证书请求将被忽略。若指定了 -spkac-ss_cert-gencrl,那么忽略 -selfsign
使用 -selfsign 的一个后果就是,自签名的证书会出现在证书数据库(参见配置选项 database)的条目中,并且该自签名证书将与用该证书签名的其它证书共用一个序列号计数器。

-passin arg

密钥加密密码的来源。关于 arg 的格式的更多信息参阅 openssl(1)PASS PHRASE ARGUMENTS 节。

-notext

不要将文本格式的证书输出值输出文件。

-startdate date

允许明确地设置起始日期。日期的格式为 YYMMDDHHMMSSZ(同 ASN1 UTCTime 结构),或者为 YYYYMMDDHHMMSSZ(同 ASN1 GeneralizedTime 结构)。两种格式下,秒数 SS 和时区 Z 必须存在。

-enddate date

允许明确地设置过期日期。日期的格式为 YYMMDDHHMMSSZ(同 ASN1 UTCTime 结构),或者为 YYYYMMDDHHMMSSZ(同 ASN1 GeneralizedTime 结构)。两种格式下,秒数 SS 和时区 Z 必须存在。

-days arg

验证证书的天数。

-md alg

要使用的信息摘要。任何被 OpenSSL dgst 命令支持的摘要算法均可被使用。对于不支持摘要的签名算法(比如 Ed15519 和 Ed448),会忽略任何信息摘要算法。该选项同样适用于 CRL。

-policy arg

该选项定义了要使用的 CA “策略”。其为配置文件中的一个段,该段决定了那些字段应该为必须字典,或者该如何匹配 CA 证书。参见 [_策略格式] 了解更多信息。

-msie_hack

这是一个弃用的选项,让 ca 能于非常古旧的 IE 证书注册控制 “certenr3”。它在几乎所有地方都是用 UniversalStrings。由于老旧的控制有很多安全 BUG,强烈不建议使用它。

-preserveDN

通常情况下,证书的 DN 顺序与相关的策略段中的字段的顺序相同。当设置了该选项后,它的顺序就与请求文件中的相同。主要是为了兼容老的 IE 注册控制,因为它仅接受证书中的 DN 与请求文件中的顺序相同的证书。在 Xenroll 中不需要。

-noemailDN

若请求 DN 中包含 EMAIL 字段,那么证书的 DN 可以包含该字段,但是,仅将电子邮件放置在证书的 altName 扩展中是更好的策略。当设置了该选项后,EMAIL 字段会从证书主体中移除,并仅会被设置在最终会出现的扩展中。可以在配置文件中使用 email_in_dn 关键字来启用该行为。

-batch

设置为批量操作模式。在该模式下不会提出任何问题,全部的证书都会被自动认证。

-extensions sections

当签发证书时,配置文件中包含了证书扩展的段会被追加(默认为 x509_extensions,除非使用了 -extfile 选项)。若不存在扩展段,那么创建 V1 证书。若存在扩展段(即便它是空的),也会创建 V3 证书。参见 x509v3_config(5) 手册了解扩展节的格式详情。

-extfile file

一个额外的配置文件,用来读取证书扩展(除非同时指定 -extensions 选项,否则使用默认段)。

-engine id

指定一个(以唯一的 id 字符串确定的)引擎,让 x509 尝试获得指定引擎的可用参考,若需要也会初始化它。该引擎会设置为所有可用算法的默认引擎。

-subj arg

取代请求给出的主体名。arg 必须格式为 /type0=value0/type1=value1/type2=…​。关键字可以用反斜线 \ 转义,白空格会被保留。允许空值,但对应的类型不会包含在结果证书中。

-utf8

字段的值将作为 UTF8 字符串解码,默用 ASCII 方式解码。这表示字段值,无论来自终端或者来自配置文件,必须是有效的 UTF8 字符串。

-create_serial

如果从配置文件中指定的文本文件中读取序列号失败了,指定该选项会创建一个新的随机序列号,作为下次使用的序列号。要获得一个随机序列号,应该使用 -rand_serial;该选项仅应该被用于简单的错误恢复。

-rand_serial

生成一个大随机数作为序列号。它覆盖任何使用序列号文件的选项或配置。

-multivalue-rdn

该选项导致 -subj 参数以支持完整多值 RDN 的方式被解析。举例:

/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe

若不使用 -multi-rdn,那么 UID 的值为 123456+CN=John Doe

-rand file…​

指定单个或多个文件,包含随机数据,作为随机数生成器的种子。指定多个文件时,文件名之间用操作系统特定的分隔符加以区分。Windows 上用分号 ;,OpenVMS 上用逗号 ,,其它系统用 :

[-writerand file]

将随机信息输出至指定的文件中。可在 -rand 参数后使用。

证书吊销列表(CRL)选项

-gencrl

该选项通过索引文件中的信息生成一个 CRL。

-crldays num

距离下次 CRL 到期的天数。也就是基于当前时间和到期天数算的的 CRL nextUpdate 字段。

-crlhours num

距离下次 CRL 到期的小时数。

-revoke filename

要吊销的证书所在的文件。

-valid filename

要追加 Valid 证书条目的证书所在的文件名。

-status serial

显示以序列号指定的证书的吊销状态,并退出。

-updatedb

更新数据库索引,移除过期证书。

-crl_reasopm reason

吊销原因,reason 为这些值之一:unspecifiedkeyCompromiseCACompromiseaffiliationChangedsupersededcessationOfOperationcertificateHoldremoveFromCRL。对 reason 的匹配是大小写敏感的。设置任何吊销原因会生成 CRL V2。
实际上,removeFromCRL 并不是非常有用,因为它仅用于差量 CRL(delta CRL),而当前并没有实现。

-crl_hold instruction

将 CRL 吊销原因码设置为 certificateHold,将保留指令(hold instruction)设置为 instruction,该值必须为一个 OID。虽然可以使用任何 OID,但通常情况下,仅会使用 holdInstructionNoneholdInstructionCallIssuerholdInstructionReject

-crl_compromise time

将吊销原因设置为 keyCompromise,将妥协时间设置为 timetime 应为 GeneralizedTime 格式,也就是 YYYYMMDDHHMMSSZ。

-crl_CA_compromise time

crl_compromise,但将吊销原因设置为 CACompromise

-crlexts section

配置文件的该段中具有要包含的 CRL 扩展。若未出现 CRL 扩展段,那么创建 V1 CRL,若出现了 CRL 扩展段(即便为空),也会创建 V2 CRL。由 CRL 扩展定义的是 CRL 扩展(CRL extension),而非 CRL 条目扩展(CRL entry extension)。应该注意的是,一些软件(比如 Netscape)不能处理 V2 CRL。参见 x509v3_config(5) 了解更多扩展段格式的细节。

配置文件选项

用于 ca 的选项的配置文件的段,依照下面的方法查找:若使用了 -name 命令行选项,则指明了要使用的段名。其他情况下,被使用的段的名称必须在配置文件的 ca 段(或配置文件的默认段)中的 default_ca 选项中指定。除了 default_ca,下述选项将从 ca 段直接读取:RANDFILEpreservemsie_hack。其中 RANDFILE 是一个例外,这可能是一个 BUG,可能会在未来的版本中有所变化。
很多配置文件选项与命令行选项相同。当选项同时在配置文件和命令行中出现,则使用命令行的值。当一个选项被描述为强制项,那么它必须出现在配置文件中,否则会使用命令行的等价物(若出现的话)。

oid_file

指定一个文件,包含额外的对象标识符(OBJECT IDENTIFIERS)。文件中的每行应该包含数字形式的对象标识符,一个白空格,接着是短名,一个白空格,最后是长名。

oid_section

在配置文件中指定一个额外的节,该节用于包含额外的对象标识符。每行应该包含对象标识符的短名,后随一个等号 =,以及它的数字形式。使用该选项时,长名和短名是等价的。

new_certs_dir

-outdir 命令行选项。它指定了新证书将被放置的目录。强制项。

certificate

-cert。它给出了包含 CA 证书的文件。强制项。

private_key

-keyfile 选项。文件包含 CA 证书的私钥。强制项。

RANDFILE

在启动时,指定的文件会载入随机数生成器,在退出时,将向其中写入 256 字节的数据。它用于私钥的生成。

default_days

-days 选项。证书认证的天数。

default_startdate

-startdate 选项。证书认证的起始日期。若不设置则使用当前时间。

default_enddate

-enddate 选项。该选项与 default_days(或等价的命令行)两者之一必须出现。

default_crl_hours defult_crl_days

-crlhours-crldays 选项。仅用于两个选项均未出现时。要生成一个 CRL,则两者之一必须出现。

default_md

-md 选项。强制项,除了签名算法不要求摘要(比如 Ed5519 和 Ed448)

database

要使用的文本数据库。强制项。该文件必须存在,即便初始情况下它可能为空。

unique_subject

若值设置为 yes,数据库中有效的证书条目必须具有唯一的主体。若设置为 no,那么多个有效证书可能会具有完全相同的主体。默认值为 yes,用来与旧版(0.9.8 之前)的 OpenSSL 兼容。但是,要让 CA 证书的延展(roll-over)更加简单,建议将该值设置为 no,特别是与 -selfsign 命令行连用时。
注意,在有些情况下,创建不含任何主体的证书是有效的。在这种情况下,不具有主体的多个证书不被认为是重复的。

serial

一个文本文件,其中包含了下一个被使用的十六进制表示的序列号。强制项。该文件必须存在,且包含一个有效的序列号。

crlnumber

十六进制表示的要使用的下一个 CRL 数。仅当该文件存在时,crl 才会被插入 CRL 中。若该文件存在,它必须包含一个有效的 CRL 数。

x509_extensions

-extensions

crl_extensions

-crlexts

preserve

-preserveDN

email_in_dn

-noemialDN。若你想从证书的 DN 中移除 EMAIL 字段,那么将该值设置为 no。若不出现,则默认值为允许 EMAIL 字段出现在证书的 DN 中。

msie_hack

-msie_hack

policy

-policy。强制项。参见 策略格式 节了解详情。

name_opt, cert_opt

这些选项指定提示用户确认签名时所使用的显示证书详情的格式。所有被 x509 工具的 -nameopt-certopt 开关支持的选项均可以在此处被使用,但 no_signameno_sigdump 为永久选项,且不能被禁用(这是因为证书签名无法显示,因为在这个时间点上证书还没有被签名)。
为了方便,接受 ca_default 这个值,用来生成一个合理的输出。
若两个选项均不出现,则使用先前版本的 OpenSSL 中的格式。强烈不鼓励使用旧格式,因为它仅会显示 policy 段提及的字段,错误地处理多字节字符串类型,且不会显示扩展。

copy_extensions

决定如何处理证书请求中的扩展。若设置为 none 或者不出现该选项,那么扩展被忽略,且不会被拷贝至证书中。若设置为 copy,那么任何没有预先出现在证书中的证书请求的扩展会被拷贝至证书中。若设置为 copyall,那么请求中的全部扩展都会被拷贝至证书中:若扩展已经出现在证书中,那么会先删除该扩展。首先参看 警告 节后再使用该参数。
该选项的主要用途时允许证书请求提供特定扩展的值,比如 subjectAltName。

策略格式

策略段包含一系列变量,这些变量与特定的 DN 字段对应。若值为 match,那么字段值必须匹配 CA 证书的相同值。若值为 supplied 那么它必须出现。若值为 optional 那么它可以出现。任何未提及的字段均会被静默地删除,除非使用了 -preserveDN 选项,不过,相较于期望的行为,这个行为不如说是一个副作用。

SPKAC 格式

-spkac 命令行选项的输入是一个 Netscape 签名公钥和挑战码。它通常来自具有 KEYGEN 标签的 HTML 表单,该表单用于创建一个新的私钥。但是也可以通过 spkac 工具创建 SPKAC。
文件应该包含变量 SPKAC,其值应该设置未 SPKAC 的值,同时也要求作为名称值对的 DN 成分。如果你需要多次包含相同的成分,那么可以再它前面补充一个数字和一个点号 .
当处理 SPKAC 格式时,若使用了 -out 标旗,输出格式为 DER;若输出为标准输出,或者使用了 -outdir 标旗,那么使用 PEM 格式。

案例

注意:这些案例假设已经建立了 ca 目录结构,且相关文件以及存在。这通常包括用 req 创建一个 CA 证书和私钥,一个序列号文件和一个空的索引文件,并将它们放置在相关的目录中。
要使用下方的案例配置文件,目录 demoCAdemoCA/privatedemoCA/newcerts 应该被创建。CA 证书应该被拷贝为 demoCA/cacert.pem,与之对应的私钥拷贝为 demoCA/private/cakey.pem。一个文件 demoCA/serial 包含一个数,比如 01,以及一个空的索引文件 demoCA/index.txt

签名一个证书请求:

openssl ca -in req.pem -out newcert.pem

用 CA 扩展,签名一个证书请求:

openssl ca -in req.pem -extensions v3_ca -out newcert.pem

生成一个 CRL

openssl ca -gencrl -out crl.pem

签名多个请求:

openssl ca -spkac spkac.txt

一个案例 SPKAC 文件(为了简洁,裁切了 SPKAC 行):

SPKAC=MIG0MGAwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAn7PDhCeV/xIxUg8V70YRxK2A5
CN=Steve Test
[email protected]
0.OU=OpenSSL Group
1.OU=Another Group

具有与 ca 相关段的样例配置文件:

[ ca ]
default_ca      = CA_default            # The default ca section

[ CA_default ]

dir            = ./demoCA              # top dir
database       = $dir/index.txt        # index file.
new_certs_dir  = $dir/newcerts         # new certs dir

certificate    = $dir/cacert.pem       # The CA cert
serial         = $dir/serial           # serial no file
#rand_serial    = yes                  # for random serial#'s
private_key    = $dir/private/cakey.pem# CA private key
RANDFILE       = $dir/private/.rand    # random number file

default_days   = 365                   # how long to certify for
default_crl_days= 30                   # how long before next CRL
default_md     = md5                   # md to use

policy         = policy_any            # default policy
email_in_dn    = no                    # Don't add the email into cert DN

name_opt       = ca_default            # Subject name display option
cert_opt       = ca_default            # Certificate display option
copy_extensions = none                 # Don't copy extensions from request

[ policy_any ]
countryName            = supplied
stateOrProvinceName    = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional

文件

注意:文件的位置可以通过下面的方法改变:编译时选项、配置文件条目、环境变量、或者命令行选项。下面的值表示默认值。

/usr/local/ssl/lib/openssl.cnf - master configuration file
./demoCA                       - main CA directory
./demoCA/cacert.pem            - CA certificate
./demoCA/private/cakey.pem     - CA private key
./demoCA/serial                - CA serial number file
./demoCA/serial.old            - CA serial number backup file
./demoCA/index.txt             - CA text database file
./demoCA/index.txt.old         - CA text database backup file
./demoCA/certs                 - certificate output file
./demoCA/.rnd                  - CA random seed information