OpenSSL

密码学和 SSL/TLS 工具包

openssl-x509

名称

openssl-x509 - 证书显示和签名命令

语法

openssl x509 [-help] [-in filename|uri] [-passin arg] [-new] [-x509toreq] [-req] [-copy_extensions arg] [-inform DER|PEM] [-vfyopt nm:v] [-key filename|uri] [-keyform DER|PEM|P12|ENGINE] [-signkey filename|uri] [-out filename] [-outform DER|PEM] [-nocert] [-noout] [-dateopt] [-text] [-certopt option] [-fingerprint] [-alias] [-serial] [-startdate] [-enddate] [-dates] [-subject] [-issuer] [-nameopt option] [-email] [-hash] [-subject_hash] [-subject_hash_old] [-issuer_hash] [-issuer_hash_old] [-ext extensions] [-ocspid] [-ocsp_uri] [-purpose] [-pubkey] [-modulus] [-checkend num] [-checkhost host] [-checkemail host] [-checkip ipaddr] [-set_serial n] [-next_serial] [-days arg] [-preserve_dates] [-set_issuer arg] [-set_subject arg] [-subj arg] [-force_pubkey filename] [-clrext] [-extfile filename] [-extensions section] [-sigopt nm:v] [-badsig] [-digest] [-CA filename|uri] [-CAform DER|PEM|P12] [-CAkey filename|uri] [-CAkeyform DER|PEM|P12|ENGINE] [-CAserial filename] [-CAcreateserial] [-trustout] [-setalias arg] [-clrtrust] [-addtrust arg] [-clrreject] [-addreject arg] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq]

描述

此命令是一个多用途证书处理命令。它可以用于打印证书信息、将证书转换为各种形式、编辑证书信任设置、从头或从证书请求生成证书,然后自签名或像“微 CA”一样签名。

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

由于存在大量选项,因此它们将分成不同的部分。

选项

输入、输出和通用选项

-help

打印使用信息。

-in filename|uri

指定要从中读取证书的输入或要读取证书请求的输入文件(如果使用 -req 标志)。在这两种情况下,默认情况下都是标准输入。

此选项不能与 -new 标志结合使用。

-passin arg

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

-new

从头开始生成证书,不使用输入证书或证书请求。因此,这排除了 -in-req 选项。相反,需要给出 -set_subject 选项。要包含的公钥可以通过 -force_pubkey 选项给出,默认情况下是通过 -key(或 -signkey)选项给出的密钥,这意味着自签名。

-x509toreq

输出 PKCS#10 证书请求(而不是证书)。-key(或 -signkey)选项必须用于提供用于自签名的私钥;相应的公钥将放置在 subjectPKInfo 字段中。

默认情况下,证书输入中包含的 X.509 扩展不会被复制。要添加的 X.509 扩展可以使用 -extfile 选项指定。

-req

默认情况下,预计输入证书。使用此选项,预计输入 PKCS#10 证书请求,该请求必须正确自签名。

请求中包含的 X.509 扩展默认情况下不会被复制。要添加的 X.509 扩展可以使用 -extfile 选项指定。

-copy_extensions arg

确定使用 -x509toreq 选项从证书转换为请求或使用 -req 选项从请求转换为证书时如何处理 X.509 扩展。如果 argnone 或者没有此选项,则忽略扩展。如果 argcopycopyall,则所有扩展都将被复制,但主体标识符和颁发者密钥标识符扩展在生成证书请求时不会被接管。

-ext 选项可用于进一步限制要复制的扩展。

-inform DER|PEM

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

-vfyopt nm:v

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

-key filename|uri

此选项提供用于签署新证书或证书请求的私钥。除非给出 -force_pubkey,否则相应的公钥将放置在新证书或证书请求中,从而导致自签名。

此选项不能与 -CA 选项一起使用。

它将颁发者名称设置为主体名称(即,使其自我颁发)。除非提供 -preserve_dates 选项,否则它将有效期开始日期设置为当前时间,并将结束日期设置为由 -days 选项确定的值。

-signkey filename|uri

此选项是 -key 的别名。

-keyform DER|PEM|P12|ENGINE

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

-out filename

指定要写入的输出文件名或默认情况下是标准输出。

-outform DER|PEM

输出格式;默认值为 PEM。有关详细信息,请参见 openssl-format-options(1)

-nocert

不输出证书(除了根据以下选项打印的证书)。

-noout

此选项会阻止输出,除了根据以下选项打印的输出。

证书打印选项

注意:-alias-purpose 选项也是打印选项,但将在 "信任设置" 部分中描述。

-dateopt

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

-text

以文本形式打印证书。打印完整详细信息,包括公钥、签名算法、颁发者和主体名称、序列号、任何存在的扩展和任何信任设置。

-certopt option

自定义与 -text 一起使用的打印格式。option 参数可以是单个选项,也可以是多个用逗号分隔的选项。-certopt 开关也可以使用多次来设置多个选项。有关更多信息,请参见 "文本打印标志" 部分。

-fingerprint

计算并打印整个证书的 DER 编码版本的摘要(参见摘要选项)。这通常称为“指纹”。由于消息摘要的性质,证书的指纹对于该证书是唯一的,并且具有相同指纹的两个证书可以被认为是相同的。

-alias

打印证书的“别名”(昵称)(如果有)。

-serial

打印证书序列号。

-startdate

打印证书的开始日期,即 notBefore 日期。

-enddate

打印证书的到期日期,即 notAfter 日期。

-dates

打印证书的开始日期和到期日期。

-subject

打印主体名称。

-issuer

打印颁发者名称。

-nameopt option

指定如何显示主体或颁发者名称。有关详细信息,请参见 openssl-namedisplay-options(1)

-email

打印电子邮件地址(如果有)。

-hash

为了向后兼容性,它是 "-subject_hash" 的同义词。

-subject_hash

打印证书主体名称的“哈希”。OpenSSL 使用它来形成索引,以便可以通过主体名称查找目录中的证书。

-subject_hash_old

使用较旧的算法打印证书主体名称的“哈希”,该算法在 OpenSSL 1.0.0 之前的版本中使用。

-issuer_hash

打印证书颁发者名称的“哈希”。

-issuer_hash_old

使用较旧的算法打印证书颁发者名称的“哈希”,该算法在 OpenSSL 1.0.0 之前的版本中使用。

-ext extensions

以文本形式打印证书扩展。也可以用于限制要复制的扩展。扩展用逗号分隔的字符串指定,例如,“subjectAltName, subjectKeyIdentifier”。有关扩展名的详细信息,请参见 x509v3_config(5) 手册页。

-ocspid

打印主体名称和公钥的 OCSP 哈希值。

-ocsp_uri

打印 OCSP 响应者地址(如果有)。

-purpose

此选项对证书扩展执行测试并输出结果。有关更完整的描述,请参见 openssl-verification-options(1) 中的“证书扩展”

-pubkey

以 PEM 格式打印证书的 SubjectPublicKeyInfo 块。

-modulus

此选项打印证书中包含的公钥的模数的值。

证书检查选项

-checkend arg

检查证书是否在接下来的 arg 秒内到期,如果到期则退出非零值,否则退出零值。

-checkhost host

检查证书是否与指定的主机匹配。

-checkemail email

检查证书是否与指定的电子邮件地址匹配。

-checkip ipaddr

检查证书是否与指定的 IP 地址匹配。

证书输出选项

-set_serial n

指定要使用的序列号。此选项可与 -key-signkey-CA 选项一起使用。如果与 -CA 选项一起使用,则不使用序列号文件(由 -CAserial 选项指定)。

序列号可以是十进制或十六进制(如果以 0x 开头)。

-next_serial

将序列号设置为证书中的数字加一。

-days arg

指定新生成的证书到期之前的日期数。默认值为 30。不能与 -preserve_dates 选项一起使用。

-preserve_dates

签署证书时,保留任何输入证书的“notBefore”和“notAfter”日期,而不是将它们调整为当前时间和持续时间。不能与 -days 选项一起使用。

-set_issuer arg

创建证书时,将颁发者名称设置为给定值。

有关 arg 的格式,请参见 -set_subject

-set_subject arg

创建证书时,将主体名称设置为给定值。当证书自签名时,颁发者名称将设置为相同的值,除非给出 -set_issuer 选项。

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

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

此选项可与 -new-force_pubkey 选项一起使用,以创建新证书,而无需提供输入证书或证书请求。

-subj arg

此选项是 -set_subject 的别名。

-force_pubkey filename

当创建新的证书或证书请求时,将它的公钥设置为给定的密钥,而不是输入中包含的密钥或使用-key(或-signkey)选项给定的密钥。如果输入不包含公钥,但包含私钥,则使用其公钥部分。

此选项可以与b<-new>和-set_subject结合使用,直接生成包含任何所需公钥的证书。

此选项对于创建非自签名的自颁发证书也很有用,例如当密钥不能用于签名时,例如 DH。

-clrext

将证书转换为新证书时,默认情况下会保留所有证书扩展。

当转换证书或证书请求时,-clrext选项将阻止从源获取任何扩展。在任何情况下,当生成证书请求时,都不包括主体标识符或颁发者密钥标识符扩展。

-extfile filename

包含要添加的证书和请求 X.509 扩展的配置文件。

-extensions section

要从中添加 X.509 扩展的 extfile 中的节。如果未指定此选项,则扩展名应包含在未命名(默认)节中,或者默认节应包含一个名为“extensions”的变量,其中包含要使用的节。

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

除非另有说明,否则密钥标识符扩展将按照x509v3_config(5)中所述的方式包含。

-sigopt nm:v

在签名操作期间将选项传递给签名算法。此选项可以多次给出。使用此选项提供的名称和值是特定于算法的。

-badsig

在写入签名之前破坏它;这对于测试很有用。

-digest

要使用的摘要。这会影响使用消息摘要的任何签名或打印选项,例如-fingerprint-key-CA选项。openssl-dgst(1)命令支持的任何摘要都可以使用。如果未指定,则在使用-fingerprint时使用 SHA1,或使用签名算法的默认摘要,通常为 SHA256。

微型 CA 选项

-CA filename|uri

指定要用于签名的“CA”证书。如果存在,这将表现为“微型 CA”,如下所示:“CA”证书的主题名称将作为颁发者名称放置在新证书中,然后使用下面详细说明的“CA”密钥进行签名。

此选项不能与-key(或-signkey)结合使用。此选项通常与引用 CSR 的-req选项结合使用。如果没有-req选项,则输入必须是现有证书,除非给出了-new选项,它会从头开始生成证书。

-CAform DER|PEM|P12,

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

-CAkey filename|uri

设置 CA 私钥以使用它对证书进行签名。私钥必须与使用-CA给出的证书的公钥匹配。如果未提供此选项,则密钥必须存在于-CA输入中。

-CAkeyform DER|PEM|P12|ENGINE

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

-CAserial filename

设置要使用的 CA 序列号文件。

使用此选项和-CA选项创建证书时,证书序列号将存储在给定文件中。该文件由一行组成,包含一个偶数个十六进制数字,其中包含上次使用的序列号。读取此数字后,它将被递增并使用,并且文件将被更新。

默认文件名由 CA 证书文件基本名称组成,并在后面追加.srl。例如,如果 CA 证书文件名为mycacert.pem,则它预计会找到一个名为mycacert.srl的序列号文件。

如果指定了-CA选项,并且没有给出<-CAserial>或<-CAcreateserial>,并且默认序列号文件不存在,则会生成一个随机数;这是推荐的做法。

-CAcreateserial

使用此选项和-CA选项,如果 CA 序列号文件不存在,则会创建它。会生成一个随机数,用于证书,并保存到上面描述的确定序列号文件中。

信任设置

受信任的证书是普通证书,它附加了几个额外的信息,例如证书的允许和禁止使用,以及可能的“别名”(昵称)。

通常,当验证证书时,至少必须有一个证书是“受信任的”。默认情况下,受信任的证书必须存储在本地,并且必须是根 CA:以该 CA 结尾的任何证书链都可以用于任何目的。

信任设置目前仅与根 CA 一起使用。它们允许对根 CA 可用于的用途进行更精细的控制。例如,一个 CA 可以被信任用于 SSL 客户端,但不能被信任用于 SSL 服务器。

有关信任设置含义的更多信息,请参见openssl-verification-options(1)

未来版本的 OpenSSL 将识别任何证书上的信任设置:不仅仅是根 CA。

-trustout

将任何证书 PEM 输出标记为<trusted>证书,而不是普通证书。可以输入普通证书或受信任证书,但默认情况下输出普通证书,并且任何信任设置都会被丢弃。使用-trustout选项会输出受信任证书。如果修改了任何信任设置,则会自动输出受信任证书。

-setalias arg

设置证书的“别名”。这将允许使用昵称引用证书,例如“Steve's Certificate”。

-clrtrust

清除证书的所有允许或受信任用途。

-addtrust arg

添加受信任的证书用途。这里可以使用任何对象名称,但目前仅定义了clientAuthserverAuthemailProtectionanyExtendedKeyUsage。从 OpenSSL 1.1.0 开始,最后一个在被拒绝时会阻止所有用途,在被信任时会启用所有用途。其他 OpenSSL 应用程序可能会定义其他用途。

-clrreject

清除证书的所有禁止或拒绝用途。

-addreject arg

添加禁止的信任锚用途。它接受与-addtrust选项相同的 value。

通用选项

-rand files, -writerand file

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

-engine id

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

-provider name
-provider-path path
-propquery propq

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

文本打印标志

除了自定义名称打印格式外,还可以使用certopt选项自定义实际打印的字段,前提是text选项存在。默认行为是打印所有字段。

compatible

使用旧格式。这等同于完全不指定任何打印选项。

no_header

不打印标题信息:即“Certificate”和“Data”这两行。

no_version

不打印版本号。

no_serial

不打印序列号。

no_signame

不打印使用的签名算法。

no_validity

不打印有效期,即notBeforenotAfter字段。

no_subject

不打印主体名称。

no_issuer

不打印颁发者名称。

no_pubkey

不打印公钥。

no_sigdump

不给出证书签名的十六进制转储。

no_aux

不打印证书信任信息。

no_extensions

不打印任何 X509V3 扩展。

ext_default

保留默认扩展行为:尝试打印不支持的证书扩展。

ext_error

对不支持的证书扩展打印错误消息。

ext_parse

ASN1 解析不支持的扩展。

ext_dump

十六进制转储不支持的扩展。

ca_default

openssl-ca(1)使用的 value,等同于no_issuerno_pubkeyno_headerno_version

示例

注意:在这些示例中,'\'表示示例应该都在一行上。

打印证书的内容

openssl x509 -in cert.pem -noout -text

打印证书的“主体备用名称”扩展

openssl x509 -in cert.pem -noout -ext subjectAltName

打印证书的更多扩展

openssl x509 -in cert.pem -noout -ext subjectAltName,nsCertType

打印证书序列号

openssl x509 -in cert.pem -noout -serial

打印证书主体名称

openssl x509 -in cert.pem -noout -subject

以 RFC2253 格式打印证书主体名称

openssl x509 -in cert.pem -noout -subject -nameopt RFC2253

在支持 UTF8 的终端上以单行形式打印证书主体名称

openssl x509 -in cert.pem -noout -subject -nameopt oneline,-esc_msb

打印证书 SHA1 指纹

openssl x509 -sha1 -in cert.pem -noout -fingerprint

将证书从 PEM 格式转换为 DER 格式

openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER

将证书转换为证书请求

openssl x509 -x509toreq -in cert.pem -out req.pem -key key.pem

使用 CA 的扩展将证书请求转换为自签名证书

openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca \
       -key key.pem -out cacert.pem

使用上面的 CA 证书签名证书请求,并添加用户证书扩展

openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr \
       -CA cacert.pem -CAkey key.pem -CAcreateserial

设置证书以被信任用于 SSL 客户端用途,并更改其别名为“Steve's Class 1 CA”

openssl x509 -in cert.pem -addtrust clientAuth \
       -setalias "Steve's Class 1 CA" -out trust.pem

注意

与名称选项一起使用的 UTF8 格式转换假设 T61Strings 使用 ISO8859-1 字符集。这是错误的,但 Netscape 和 MSIE 以及许多证书都这样做。因此,虽然这是不正确的,但它更有可能正确打印大多数证书。

-email选项搜索主体名称和主体备用名称扩展。只会打印唯一的电子邮件地址:它不会打印相同的地址多次。

错误

通过指定错误的私钥、使用不合适的 X.509 扩展或在某些情况下使用不一致的选项,可能会生成无效的证书或请求:应检查这些问题。

应该有选项明确设置诸如开始和结束日期之类的东西,而不是从当前时间偏移。

另请参见

openssl(1)openssl-req(1)openssl-ca(1)openssl-genrsa(1)openssl-gendsa(1)openssl-verify(1)x509v3_config(5)

历史

在 OpenSSL 1.0.0 之前,-subject_hash-issuer_hash选项中使用的哈希算法基于已弃用的 MD5 算法和可区分名称的编码。在 OpenSSL 1.0.0 及更高版本中,它基于使用 SHA1 的 DN 的规范版本。这意味着使用旧形式的任何目录都必须使用openssl-rehash(1)或类似方法重新构建其链接。

在 OpenSSL 3.0 中,-signkey选项已重命名为-key,保留旧名称作为别名。

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

在 OpenSSL 3.0 中,-C选项已删除。

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

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

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