OpenSSL

密码学和 SSL/TLS 工具包

openssl-ca

名称

openssl-ca - 示例最小 CA 应用程序

语法

openssl ca [-help] [-verbose] [-quiet] [-config filename] [-name section] [-section section] [-gencrl] [-revoke file] [-valid file] [-status serial] [-updatedb] [-crl_reason reason] [-crl_hold instruction] [-crl_compromise time] [-crl_CA_compromise time] [-crl_lastupdate date] [-crl_nextupdate date] [-crldays days] [-crlhours hours] [-crlsec seconds] [-crlexts section] [-startdate date] [-enddate date] [-days arg] [-md arg] [-policy arg] [-keyfile filename|uri] [-keyform DER|PEM|P12|ENGINE] [-key arg] [-passin arg] [-cert file] [-certform DER|PEM|P12] [-selfsign] [-in file] [-inform DER|<PEM>] [-out file] [-notext] [-dateopt] [-outdir dir] [-infiles] [-spkac file] [-ss_cert file] [-preserveDN] [-noemailDN] [-batch] [-msie_hack] [-extensions section] [-extfile section] [-subj arg] [-utf8] [-sigopt nm:v] [-vfyopt nm:v] [-create_serial] [-rand_serial] [-multivalue-rdn] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq] [certreq...]

描述

此命令模拟 CA 应用程序。请务必查看警告,尤其是在考虑将它用于生产环境时。

它生成包含 X.509 版本 3 的证书。除非另有说明,否则密钥标识符扩展将按 x509v3_config(5) 中所述包含。

它可以用于以各种形式签署证书请求 (CSR) 并生成证书吊销列表 (CRL)。它还维护一个已颁发证书及其状态的文本数据库。在签署证书时,可以使用-in选项指定单个请求,或者通过在所有选项之后指定一组certreq文件来处理多个请求。

请注意,还有一些生成证书的非常简便的方法:reqx509 命令可用于直接创建证书。有关详细信息,请参见 openssl-req(1)openssl-x509(1)

ca 命令选项的描述按用途划分。

选项

-help

打印使用消息。

-verbose

这将打印有关正在执行的操作的更多详细信息。

-quiet

这将打印有关正在执行的操作的更少详细信息,在批处理脚本或管道中可能很方便。

-config filename

指定要使用的配置文件。可选;有关默认值的描述,请参见 openssl(1) 中的“命令摘要”

-name section, -section section

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

-in filename

包含要由 CA 签署的单个证书请求 (CSR) 的输入文件名。

-inform DER|PEM

加载证书请求 (CSR) 输入文件时要使用的格式;默认情况下,首先尝试 PEM。有关详细信息,请参见 openssl-format-options(1)

-ss_cert filename

要由 CA 签署的单个自签名证书。

-spkac filename

包含要由 CA 签署的单个 Netscape 签署的公钥和质询以及其他字段值的文

-infiles

如果存在,这应该是最后一个选项,所有后续参数将被视为包含证书请求的文件名。

-out filename

要输出证书的输出文件。默认值为标准输出。证书详细信息也将以 PEM 格式输出到此文件(除了-spkac输出 DER 格式)。

-outdir directory

要输出证书的目录。证书将写入以十六进制表示的序列号后跟.pem的文件名。

-cert filename

CA 证书,必须与-keyfile匹配。

-certform DER|PEM|P12

证书输入文件中的数据格式;默认情况下未指定。有关详细信息,请参见 openssl-format-options(1)

-keyfile filename|uri

要用于签署证书请求的 CA 私钥。这必须与-cert匹配。

-keyform DER|PEM|P12|ENGINE

私钥输入文件的格式;默认情况下未指定。有关详细信息,请参见 openssl-format-options(1)

-sigopt nm:v

在签署操作期间将选项传递给签名算法。这些选项的名称和值是特定于算法的。

-vfyopt nm:v

在验证操作期间将选项传递给签名算法。这些选项的名称和值是特定于算法的。

这通常也需要在签署时提供,因为证书签署请求 (CSR) 的自签名会根据包含的公钥进行验证,而此验证可能需要它自己的选项集。

-key password

用于加密私钥的密码。由于在某些系统上,命令行参数是可见的(例如,在 Unix 上使用 ps(1) 时),因此应谨慎使用此选项。最好使用-passin

-passin arg

密钥文件的密钥密码源和证书 PKCS#12 文件。有关arg格式的更多信息,请参见 openssl-passphrase-options(1)

-selfsign

指示已颁发的证书将使用签署证书请求的密钥进行签署(使用-keyfile提供)。使用不同密钥签署的证书请求将被忽略。如果提供了-spkac-ss_cert-gencrl,则会忽略-selfsign

使用-selfsign的一个结果是,自签名证书将出现在证书数据库中的条目中(参见配置选项database),并且使用与所有其他使用自签名证书签署的证书相同的序列号计数器。

-notext

不要将证书的文本形式输出到输出文件。

-dateopt

指定日期输出格式。值为:rfc_822 和 iso_8601。默认为 rfc_822。

-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(1)命令支持的任何摘要。对于不支持摘要的签名算法(即 Ed25519 和 Ed448),将忽略设置的任何消息摘要。此选项也适用于 CRL。

-policy arg

此选项定义要使用的 CA“策略”。这在配置文件中的一个部分,该部分决定哪些字段应该是强制性的或与 CA 证书匹配。有关更多信息,请查看策略格式部分。

-msie_hack

这是一个已弃用的选项,用于使此命令能够与 IE 证书注册控件“certenr3”的非常旧版本一起使用。它使用通用字符串来表示几乎所有内容。由于旧的控件存在各种安全漏洞,因此强烈建议不要使用它。

-preserveDN

通常,证书的 DN 顺序与相关策略部分中的字段顺序相同。当设置此选项时,顺序与请求相同。这主要用于与旧的 IE 注册控件兼容,该控件仅在证书的 DN 与请求的顺序匹配时才接受证书。Xenroll 不需要这样做。

-noemailDN

证书的 DN 可以包含 EMAIL 字段(如果存在于请求 DN 中),但是,最好只将电子邮件设置为证书的 altName 扩展。当设置此选项时,EMAIL 字段将从证书的主题中删除,并且仅在最终存在的扩展中设置。email_in_dn关键字可以在配置文件中使用以启用此行为。

-batch

这将设置批处理模式。在此模式下,不会询问任何问题,所有证书都将自动认证。

-extensions section

配置文件中包含证书扩展的部分,这些扩展将在颁发证书时添加(默认为x509_extensions,除非使用-extfile选项)。

有关扩展部分格式的详细信息,请参见 x509v3_config(5) 手册页。

-extfile file

要从中读取证书扩展的附加配置文件(使用默认部分,除非还使用了-extensions选项)。

-subj arg

取代请求中给出的主题名称。

arg 必须格式化为/type0=value0/type1=value1/type2=...。特殊字符可以通过\(反斜杠)转义,空格将保留。允许空值,但相应的类型将不会包含在生成的证书中。给出单个/将导致空 RDN 序列(一个 NULL-DN)。多值 RDN 可以通过在指定集合成员的 AttributeValueAssertions (AVA) 之间放置+字符来代替/字符来形成。示例

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

-utf8

此选项会导致字段值被解释为 UTF8 字符串,默认情况下,它们被解释为 ASCII。这意味着字段值(无论是从终端提示还是从配置文件中获取)都必须是有效的 UTF8 字符串。

-create_serial

如果从配置文件中指定的文本文件读取序列号失败,则指定此选项会创建一个新的随机序列号,用作下一个序列号。要获得随机序列号,请改用-rand_serial标志;这仅应在简单的错误恢复中使用。

-rand_serial

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

-multivalue-rdn

此选项已弃用,没有任何效果。

-rand files, -writerand file

有关详细信息,请参见 openssl(1) 中的“随机状态选项”

-engine id

参见 openssl(1) 中的“引擎选项”。此选项已弃用。

-provider name
-provider-path path
-propquery propq

参见 openssl(1) 中的“提供程序选项”provider(7)property(7)

CRL 选项

-gencrl

此选项根据索引文件中的信息生成 CRL。

-crl_lastupdate time

允许显式设置 CRL 的 lastUpdate 字段的值;如果此选项不存在,则使用当前时间。接受 YYMMDDHHMMSSZ 格式(与 ASN1 UTCTime 结构相同)或 YYYYMMDDHHMMSSZ 格式(与 ASN1 GeneralizedTime 结构相同)的时间。

-crl_lastupdate 时间

允许显式设置 CRL 的 nextUpdate 字段的值;如果此选项存在,则忽略为 -crldays-crlhours-crlsec 给定的任何值。接受与 -crl_lastupdate 相同格式的时间。

-crldays 数字

下一个 CRL 到期前的天数。即从现在到 CRL nextUpdate 字段中要放置的天数。

-crlhours 数字

下一个 CRL 到期前的小时数。

-crlsec 数字

下一个 CRL 到期前的秒数。

-revoke 文件名

包含要吊销的证书的文件名。

-valid 文件名

包含要添加有效证书条目的文件名。

-status 序列号

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

-updatedb

更新数据库索引以清除过期的证书。

-crl_reason 原因

吊销原因,其中 原因 为以下之一:unspecifiedkeyCompromiseCACompromiseaffiliationChangedsupersededcessationOfOperationcertificateHoldremoveFromCRL原因 的匹配不区分大小写。设置任何吊销原因将使 CRL 为 v2。

实际上,removeFromCRL 没什么用,因为它只在增量 CRL 中使用,而增量 CRL 目前尚未实现。

-crl_hold 指令

这将 CRL 吊销原因代码设置为 certificateHold,并将保留指令设置为 指令,该指令必须是 OID。尽管可以使用任何 OID,但通常仅使用 holdInstructionNone(RFC2459 不鼓励使用)holdInstructionCallIssuerholdInstructionReject

-crl_compromise 时间

这将吊销原因设置为 keyCompromise,并将妥协时间设置为 时间时间 应采用 GeneralizedTime 格式,即 YYYYMMDDHHMMSSZ

-crl_CA_compromise 时间

这与 crl_compromise 相同,只是吊销原因设置为 CACompromise

-crlexts

配置文件中包含要包含的 CRL 扩展的节。如果不存在 CRL 扩展节,则创建 V1 CRL,如果 CRL 扩展节存在(即使它为空),则创建 V2 CRL。指定的 CRL 扩展是 CRL 扩展,不是 CRL 条目扩展。需要注意的是,某些软件(例如 Netscape)无法处理 V2 CRL。有关扩展节格式的详细信息,请参阅 x509v3_config(5) 手册页。

配置文件选项

配置文件中包含此命令选项的节如下所示:如果使用 -name 命令行选项,则它将命名要使用的节。否则,要使用的节必须在配置文件 ca 节的 default_ca 选项(或配置文件的默认节)中命名。除了 default_ca 之外,以下选项直接从 ca 节中读取:RANDFILE preserve msie_hack 除了 RANDFILE 之外,这可能是一个错误,可能会在将来的版本中更改。

许多配置文件选项与命令行选项相同。如果配置文件和命令行中都存在该选项,则使用命令行值。如果将选项描述为必需的,则它必须出现在配置文件中,或者必须使用命令行等效项(如果有)。

oid_file

这指定了一个包含其他 对象标识符 的文件。文件中的每一行都应包含对象标识符的数字形式,后面是空格,然后是简短名称,然后是空格,最后是长名称。

oid_section

这指定了配置文件中包含额外对象标识符的节。每一行都应包含对象标识符的简短名称,后面是 = 和数字形式。使用此选项时,简短名称和长名称相同。

new_certs_dir

-outdir 命令行选项相同。它指定了放置新证书的目录。必需的。

certificate

-cert 相同。它给出包含 CA 证书的文件。必需的。

private_key

-keyfile 选项相同。包含 CA 私钥的文件。必需的。

RANDFILE

启动时,指定的将被加载到随机数生成器中,并在退出时将写入 256 字节到该文件中。(注意:使用 RANDFILE 现在已不再必要,请参阅 "历史记录" 部分。

default_days

-days 选项相同。为证书认证的天数。

default_startdate

-startdate 选项相同。为证书认证的开始日期。如果未设置,则使用当前时间。

default_enddate

-enddate 选项相同。必须存在此选项或 default_days(或命令行等效项)。

default_crl_hours default_crl_days

-crlhours-crldays 选项相同。只有在命令行中都不存在时才会使用这些选项。必须存在至少一个,才能生成 CRL。

default_md

-md 选项相同。必需的,除非签名算法不需要摘要(例如 Ed25519 和 Ed448)。

database

要使用的文本数据库文件。必需的。此文件必须存在,但最初将为空。

unique_subject

如果给出值 yes,则数据库中的有效证书条目必须具有唯一的主题。如果给出值 no,则多个有效证书条目可能具有完全相同的主题。默认值为 yes,以兼容旧版本(0.9.8 之前)的 OpenSSL。但是,为了使 CA 证书切换更容易,建议使用值 no,特别是如果与 -selfsign 命令行选项结合使用。

请注意,在某些情况下,可以创建没有主题的证书。如果存在多个没有主题的证书,则不视为重复。

serial

包含要使用的下一个序列号的文本文件,以十六进制表示。必需的。此文件必须存在,并且必须包含有效的序列号。

crlnumber

包含要使用的下一个 CRL 号码的文本文件,以十六进制表示。只有当此文件存在时,才会将 CRL 号码插入 CRL 中。如果此文件存在,则它必须包含有效的 CRL 号码。

x509_extensions

-extensions 选项的回退。

crl_extensions

-crlexts 选项的回退。

preserve

-preserveDN 相同

email_in_dn

-noemailDN 相同。如果您想从证书的 DN 中删除 EMAIL 字段,只需将其设置为“no”。如果不存在,则默认允许在证书的 DN 中使用 EMAIL 字段。

msie_hack

-msie_hack 相同

policy

-policy 相同。必需的。有关更多信息,请参阅 策略格式 部分。

name_optcert_opt

这些选项允许使用格式来显示证书详细信息,以便在询问用户确认签名时显示。此处可以使用的所有选项均受 x509 实用程序 -nameopt-certopt 开关支持,但 no_signameno_sigdump 永久设置为不可禁用(这是因为证书签名无法显示,因为证书此时尚未签名)。

为了方便起见,ca_default 值被 name_optcert_opt 接受,以产生合理的输出。

如果不存在任何选项,则使用 OpenSSL 早期版本中使用的格式。强烈建议不要使用旧格式,因为它仅显示策略部分中提到的字段,错误处理多字符字符串类型,并且不显示扩展。

copy_extensions

确定如何处理证书请求中的扩展。如果设置为 none 或此选项不存在,则忽略扩展,不将其复制到证书中。如果设置为 copy,则将请求中存在的任何未在证书中存在的扩展复制到证书中。如果设置为 copyall,则将请求中的所有扩展复制到证书中:如果扩展已存在于证书中,则先将其删除。在使用此选项之前,请参阅 警告 部分。

此选项的主要用途是允许证书请求为某些扩展提供值,例如 subjectAltName。

策略格式

策略部分包含一组与证书 DN 字段相对应的变量。如果值为“match”,则字段值必须与 CA 证书中的相同字段匹配。如果值为“supplied”,则它必须存在。如果值为“optional”,则它可以存在。策略部分中未提及的任何字段将被静默删除,除非设置了 -preserveDN 选项,但这可以被视为怪癖而不是预期的行为。

SPKAC 格式

-spkac 命令行选项的输入是 Netscape 签名的公钥和挑战。这通常来自 HTML 表单中的 KEYGEN 标记,用于创建新的私钥。但是,可以使用 openssl-spkac(1) 创建 SPKAC。

文件应包含设置为 SPKAC 值的变量 SPKAC,以及作为名称值对所需的 DN 组件。如果您需要包含两次相同的组件,则可以在其前面加上数字和“.”。

在处理 SPKAC 格式时,如果使用 -out 标志,则输出为 DER,但如果发送到标准输出或使用 -outdir 标志,则输出为 PEM 格式。

示例

注意:这些示例假设此命令假设的目录结构已设置,相关文件已存在。这通常涉及使用 openssl-req(1) 创建 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

签署 SM2 证书请求

openssl ca -in sm2.csr -out sm2.crt -md sm3 \
        -sigopt "distid:1234567812345678" \
        -vfyopt "distid:1234567812345678"

使用 CA 扩展签署证书请求

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

生成 CRL

openssl ca -gencrl -out crl.pem

签署多个请求

openssl ca -infiles req1.pem req2.pem req3.pem

认证 Netscape SPKAC

openssl ca -spkac spkac.txt

示例 SPKAC 文件(SPKAC 行已为清晰起见而截断)

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

包含此命令相关节的示例配置文件

[ 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

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

限制

文本数据库索引文件是整个流程的关键部分,如果损坏,可能难以修复。理论上可以通过所有已签发证书和当前 CRL 重建索引文件,但目前没有可用的选项来执行此操作。

目前不支持 V2 CRL 功能,例如增量 CRL。

虽然可以同时输入和处理多个请求,但一次只能包含一个 SPKAC 或自签名证书。

错误

此命令很古怪,有时非常不友好。

当存在大量证书时,使用内存中文本数据库会导致问题,因为顾名思义,数据库必须保存在内存中。

此命令确实需要重写,或者在命令或接口级别公开所需的功能,以便更友好的替代方案能够正确处理。脚本 CA.pl 有一些帮助,但效果不大。

请求中不存在于策略中的任何字段都会被静默删除。如果使用了 -preserveDN 选项,则不会发生这种情况。为了在 RFC 建议下,无论请求主题内容如何,强制在 DN 中禁止使用 EMAIL 字段,可以使用 -noemailDN 选项。行为应该更加友好且可配置。

通过拒绝认证证书来取消某些命令会导致创建空文件。

警告

此命令最初是为了作为如何在 CA 中执行操作的示例。其代码没有生产质量。它原本不应该用作完整的 CA,但有些人至少在内部将其用于此目的。这样做时,应特别注意妥善保护用于签署证书的私钥。建议将它们保存在安全硬件存储设备(如智能卡或 HSM)中,并通过合适的引擎或加密提供者访问它们。

此命令实际上是单用户命令:不会对各种文件进行锁定,尝试在同一数据库上运行多个 openssl ca 命令会导致不可预测的结果。

应谨慎使用 copy_extensions 选项。如果不注意,它可能会造成安全风险。例如,如果证书请求包含具有 CA:TRUE 的 basicConstraints 扩展,并且 copy_extensions 值设置为 copyall,并且用户在显示证书时没有发现这一点,那么这将向请求者提供有效的 CA 证书。可以通过将 copy_extensions 设置为 copy 并在配置文件中包含具有 CA:FALSE 的 basicConstraints 来避免这种情况。然后,如果请求包含 basicConstraints 扩展,它将被忽略。

建议还包括其他扩展的值,例如 keyUsage,以防止请求提供自己的值。

可以对 CA 证书本身施加额外的限制。例如,如果 CA 证书具有

basicConstraints = CA:TRUE, pathlen:0

那么,即使证书以 CA:TRUE 签发,它也将无效。

历史

自 OpenSSL 1.1.1 起,该程序遵循 RFC5280。具体来说,证书有效期(由 -startdate-enddate-days 中的任何一个指定)和 CRL 最后/下一个更新时间(由 -crl_lastupdate-crl_nextupdate-crldays-crlhours-crlsec 中的任何一个指定)将在日期早于 2049 年(包括)时被编码为 UTCTime,而在日期为 2050 年或以后时被编码为 GeneralizedTime。

OpenSSL 1.1.1 引入了新的随机生成器(CSPRNG),并改进了种子机制。新的种子机制使得不再需要定义 RANDFILE 来保存和恢复随机数。此选项主要出于兼容性原因而保留。

-section 选项是在 OpenSSL 3.0.0 中添加的。

-multivalue-rdn 选项在 OpenSSL 3.0.0 中已过时,不再起作用。

-engine 选项在 OpenSSL 3.0 中已弃用。

自 OpenSSL 3.2 起,生成的证书将采用 X.509 版本 3,并且默认情况下会包含密钥标识符扩展。

另请参见

openssl(1)openssl-req(1)openssl-spkac(1)openssl-x509(1)CA.pl(1)config(5)x509v3_config(5)

版权所有 2000-2023 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)授权。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件中或在 https://www.openssl.org/source/license.html 中获取副本。