Skip to content

Latest commit

 

History

History
522 lines (355 loc) · 22.5 KB

86.5、openssl x509.adoc

File metadata and controls

522 lines (355 loc) · 22.5 KB

x509

名称

openssl-x509, x509 - 证书显示和签发工具

描述

x509 命令是一个多功能证书工具。它可以被用于显示证书信息,将证书转换为多种形式,像 “迷你 CA” 一样为证书请求签名,或者编辑证书可信(trust)设置。
由于有很多选项,它们将分为多个节。

选项

输入,输出,以及通用选项

-help

打印使用信息。

-inform DER|PEM

通常情况下,该命令期望输入的格式为 X509 证书,可以通过该参数指定输入的格式。一般可以与 -req 等参数连用。

-outform DER|PEM

指定输出格式,该选项具有与 -inform 选项相同的含义和默认值。

-in filename

指定读入证书的文件名,若不指定则使用标准输入。

-out filename

指定要写入的输出文件的文件名,默认输出至标准输出。

-digest

要使用的摘要算法。该选项影响任何使用信息摘要的签名或者显示选项,比如 -fingerprint-signkey-CA 选项。任何被 OpenSSL dgst 命令支持的摘要算法均可被使用。若不指定,则在指定 -fingerprint 时,使用 SHA1 算法,其它签名算法使用其默认的摘要算法,主要是 SHA25。

-rand file…​

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

[-writerand file]

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

-engine id

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

-preserve_datas

当签发一个证书时,保留 “notBefore” 以及 “notAfter” 数据,而不将其修改为当前的时间和有效期。不可以与 -days 选项连用。

显示选项

Note

-alias-purpose 选项同样为显示选项,但它们在 信任设置 节描述。

-text

以文本形式打印证书。输出以下详情:公钥、签名算法、签发者和主体名、序列号、任何出现的扩展属性、以及可信设置。

-ext extension

以文本的形式打印证书扩展。扩展用逗号分隔的字符串指定,比如“subjectAltName,subjectKeyIdentifier”。参见文档 x509v3_config(5) 了解扩展名。

-certopt option

在使用 -text 时,自定义输出格式。参数可以是单个选项,或者用逗号分隔的多个选项。也可以多次使用 -certopt 来设置多个选项。参见 文本选项 节了解更多信息。

-noout

阻止输出编码过后的证书。

-pubkey

输出 PEM 格式的证书的 SubjectPublicKeyInfo 块。

-modulues

该选项输出证书中包含的公钥的模数的值。

-serial

输出证书序列号。

-subject_hash

输出证书主体名的“散列值”。可被 OpenSSL 用于构建一个序列,允许一个目录中的证书通过主体名来查找。

-issuer_hash

输出证书签发者的“散列值”。

-ocspid

输出主体名和公钥的在线证书状态协议(OCSP)散列值。

-hash

出于向前兼容性的缘由,作为 -subject_hash 参数的同义词。

-subject_hash_old

使用较旧的(OpenSSL 1.0.0 之前使用的)算法输出证书主体名的“散列值”。

-issuer_hash_old

使用较旧的(OpenSSL 1.0.0 之前使用的)算法输出证书签发者名的“散列值”。

-subject

输出主体名。

-issuer

输出签发者名。

-nameopt option

决定了主体名和签发者名如何被显示。参数可以是单个选项,或者用逗号分隔的多个选项。也可以多次使用 -nameopt 来设置多个选项。参见 文本选项 节了解更多信息。

-email

若有,则输出电子邮件地址。

-ocsp_uri

若有,则输出在线证书状态协议响应端(OCSP responder)的地址。

-startdate

打印证书的起始日期,也就是 notBefore 日期。

-enddate

打印证书的过期日期,也就是 notAfter 日期。

-dates

打印证书的起止日期。

-checkend arg

检查一个证书是否在下 arg 秒后失效,若会失效则返回非零值,否则返回零。

-fingerprint

计算并输出 DER 编码的整个证书的摘要(参见 digest 选项)。它通常被称为“指纹”。由于信息摘要的特性,一个证书的指纹是唯一的,两个具有相同指纹的证书可以被认为是相同的。

-C

以 C 源码文件的格式输出证书。

可信(trust)设置

一个可信证书trusted certificate)是附加了额外信息的普通证书,附加的信息包含证书允许和禁止的使用范围,以及一个“别名(alias)”。
通常情况下,当一个证书被验证时,(信任链上)至少有一个证书是“可信的”。默认情况下,可信证书必须在本地存储,且必须为根 CA:此时任何该 CA 下的证书链可以用作任何目的。
可信设置当前仅用于根 CA。它们用于更精细地控制根 CA 的用途。举例来说,CA 可以用于 SSL 客户端而非 SSL 服务器上。
参见 verify 工具的描述了解可信设置的含义的更多信息。
未来版本的 OpenSSL 可以识别任何证书上的可信设置:并非仅有根 CA。

-trustout

x509 输出可信证书。通常证书和可信证书均可以作为输入,但默认情况下,仅输出通常证书,任何可信设置均会被移除。指定了 -trustout 选项之后,将会输出可信证书。若修改了任何可信设置,一个可信证书将被自动输出。

-setalias arg

设置证书的别名。它允许用一个昵称指代证书,比如 “Steve’s Certificate”。

-alias

若有,则输出别名。

-clrtrust

移除证书中全部的允许或可信用途。

-clrreject

移除证书中全部的禁止或回绝用途。

-addtrust arg

添加一个可信的证书用途。任何对象名均可被使用,但当前仅启用了 clientAuth(SSL 客户端用途),serverAuth(SSL 服务器用途),emailProtection(S/MIME 邮件),anyExtendedKeyUsage。就 OpenSSL 1.1.0 来说,最后一个选项在设置在拒绝字段时,阻止全部的用途;设置在可信字段时,启用全部的用途。其它 OpenSSL 应用可能会定义额外的用途。

-addreject arg

添加一个禁止用途。接受与 -addtrust 选项相同的值。

-purpose

该选项对认证扩展执行测试,并输出结果。了解更完整的信息,参见 证书扩展 节。

签发选项

x509 工具可以被用于签署证书以及请求:因此它就像是一个“迷你 CA”。

-signkey arg

该选项使用提供的私钥或引擎自签输入文件。私钥的格式通过 -keyform 选项指定。
若输入文件为证书,则将签发者名设置为主体名(也即自签名),将公钥设置为提供的值,并修改起止日期。启用日期为当前时间,结束日期由 -days 选项决定。除非使用 -clrext 选项,否则保留任何证书扩展;举例来说,这会包含任何已经存在的密钥标识符扩展。
若输入文件为证书请求,则使用提供的私钥,以及请求中的主体名,创建一个自签名证书。

-sigopt nm:v

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

-passin arg

密钥密码源。关于 arg 选项的更多信息,参阅 openssl(1)PASS PHRASE ARGUMENTS 节。

-clrext

从证书中删除任何扩展。该选项用于从一个证书中创建另一个证书(比如与 -signkey-CA 选项连用时)。通常情况下,会保留全部扩展。

-keyform PEM|DER|ENGINE

指定 -signkey 选项输入的私钥文件的格式(DER 或 PEM)。

-days arg

指定证书有效的天数。默认值为 30 天。不可以与 -preserve_dates 选项连用。

-x509toreq

将证书转换为证书请求。使用 -signkey 选项传递私钥。

-req

默认情况下,期望的输入文件为证书。使用该选项后,期望的输入文件为证书请求。

-set_serial n

指定要使用的序列号。该选项可以与 -signkey 或者 -CA 选项连用。若与 -CA 选项连用,则(用 -CAserial-CAcreateserial 选项指定的)序列号文件不会被使用。
序列号可以用十进制或(前缀 0x 的)十六进制指定。

-CA filename

指定签名用的 CA 证书。当指定该选项时, x509 的行为类似 “迷你 CA”。输入文件由该选项指定的 CA 签名:也就是说,证书的签发者名设置为 CA 的主体名,并使用 CA 的私钥进行数字签名。
该选项通常与 -req 选项连用。不与 -req 连用时,输入的文件为一个证书,且该证书必须为自签名的。

-CAkey filename

设置用于证书签名的 CA 私钥。若不指定该选项在,则假设 CA 私钥包含在 CA 证书文件中。

-CAserial filename

设置要使用的 CA 序列号文件。
当使用 -CA 选项签名一个证书时,会使用一个文件中指定的一个序列号。该文件由一行组成,该行为偶数位数的十六进制值,其值为要使用的序列号。每次使用后,序列号会递增,并再次写入文件中。
默认文件名由 CA 证书的基文件名(base name)以及后缀 .srl 组成。举例来说,若 CA 证书的文件名为 “mycacert.pem”,那么它希望找到的序列号文件名为 “mycacert.srl”。

-CAcreateserial

使用了该选项后,若 CA 序列号文件不存在,就创建它:它会包含序列号“02”,且被签名的证书将具有序列号 1。若指定了 -CA 选项,且序列号文件不存在,则生成一个随机值;其为推荐实践方法。

-extfile name

文件包含了要使用的证书扩展。若不指定那么不向证书中添加扩展。

-extensions section

添加证书扩展的来源段。若该选项不存在,则扩展要么存在于不具名(默认)段,或者默认段应该包含一个称为 “extensions” 的变量,其指向要使用的段。参见 x509v3_config(5) 手册了解扩展节的格式详情。

-force_pubkey key

当创建证书时,将它的公钥设置为 key,而非证书或证书请求中包含的密钥。在创建证书,且算法无法正常签名请求(比如 DH)时,非常有用。
key 的格式可以由 -keyform 选项指定。

名称选项

nameopt 命令行参数决定了主体名和签发者名如何显示。若不指定 nameopt 则使用默认的“单行(oneline)”格式,其与前序版本的 OpenSSL 兼容。下方将详细解释每个选项,全部的选项都可以在前缀连字符 - 将该选项关闭。通常情况下,仅有前四个参数会被使用。

compat

使用旧格式。

RFC2253

以兼容 RFC2253 的格式显示,等价于 esc_2253,esc_ctrl,esc_msb, utf8,dump_nostr,dump_unknown,dump_der,sep_comma_plus,dn_rev,sname

oneline

一行输出,比 RFC2253 更加可读。等价于 esc_2253,esc_ctrl,esc_msb,utf8,dump_nostr,dump_der,use_quote,sep_comma_plus_space,space_eq,sname。若不指定名称选项,则该值为默认值。

multiline

一个多行格式。等价于 esc_ctrl,esc_msb,sep_multiline,space_eq,lname,align

esc_2253

在字段中转义 RFC2253 中定义的特殊字符,也就是 , + " < > ;。除此之外,字符串头部的 #,以及字符串头尾的一个空格都会被转义。

esc_2254

在字段中转义 RFC2254 中定义的特殊字符。也就是 NUL 字符和 ( ) *

esc_ctrl

转义控制字符。也就是 ASCII 值小于 0x20(空格)和删除(0x7f)字符。它们转义时使用 RFC2253 的 \XX 标注法(XX 为表示字符值的两位十六进制数字)。

esc_msb

转义设置了 MSB 的字符,也就是 ASCII 值大于 127 的字符。

use_quote

将整个字符串用引号 " 包裹来转义一些字符,而非使用反斜线 \ 转义字符。

utf8

首先将字符串转换为 UTF8 格式。该行为由 RFC2253 要求。如果你的终端兼容 UTF8,那么设置为该值(且设置 esc_msb)可能会正确显示多字节(国际)字符。若该选项未出现,那么超过 0xff 的 16 位多字节字符将表示为 \UXXXX,而 32 位的多字节字符将表示为 \WXXXXXXXX。同样的,若不指定该值,那么任何 UTF8String 都会首先转换为它们的字符形式。

ignore_type

该选项不会尝试解析多字节字符。也就是说,这些八进制内容会仅仅以一个八进制表示一个字符的方式被 dump 下来。在诊断时很好用,但输出时就显得很奇怪了。

show_type

显示 ASN1 字符串的类型。类型前缀在字段内容前。比如说“BMPSTRING: Hello World”。

dump_der

指定该选项时,任何需要 hexdump 的字段,均会使用 DER 编码,再 dump。否则就仅显示为八进制值。两者均使用 RFC2253 的 #XXXX…​ 格式。

dump_nostr

dump 非字符字符串类型(比如 OCTET STRING),若不指定该选项,则非字符串类型将显示为每个八进制值表示一个单独的字符。

dump_all

dump 全体字段。与 dump_der 连用时,可明确结构体使用 DER 编码。

dump_unknown

dump 任何 OpenSSL 无法识别字段的 OID 的字段。

sep_comma_plus, sep_comma_plus_space, sep_semi_plus_space, sep_multiline

该选项决定字段的分隔符。首个字符用在 RDN 之间使用,第二个字符用在多个 AVA 之间(多重 AVA 非常少见,且不建议这样使用)。该选项中以“space”结尾的选项在分隔符后追加一个空格,让输出更可读。sep_multiline 在 RDN 之间使用换行符作为分隔,在 AVA 之间使用加号 + 作为分隔符。同时使用四个空格缩进字段。若不指定字段分隔符,则默认使用 sep_comma_plus_space

dn_rev

反转 DN 字段的顺序。如 RFC2253 所要求的。它有一个副作用,会同时会反转 AVA 字段。

nofname, sname, lname, oid

改变字段名的显示选项。nofname 完全不显示字段。sname 使用“短名”格式(用 CN 表示 commonName)。lname 使用长格式。oid 以数字形式显示 OID,对于诊断很有用。

align

对其字段值,让输出更可读。仅与 sep_multiline 连用时有效。

space_eq

在字段名和字段值之间的等号 = 两侧添加空格。

文本选项

除了名称的输出格式,也可以在使用了 text 选项后,通过 certopt 选项自定义打印出的实际字段。默认行为为打印所有字段。

compatible

使用旧个hi。等价于不指定任何输出选项。

no_header

不打印头信息:也就是包含了 “Certificate” 和 “Data” 的行。

no_version

不打印版本号。

no_serial

不打印序列号。

no_signame

不打印所使用的签名算法。

no_validity

不打印有效期,对应 noBeforenoAfter 字段。

no_subject

不打印主体名。

no_issuer

不打印签发者名。

no_pubkey

不打印公钥。

no_sigdump

不给出十六进制版本的证书签名。

no_aux

不打印证书可信信息。

no_extensions

不打印任何 X509V3 扩展。

ext_default

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

ext_error

为不被支持的证书扩展打印一个错误。

ext_parse

ASN1 解析不被支持的扩展。

ext_dump

用十六进制 dump 不被支持的扩展。

ca_default

ca 工具使用的值,等价于 no_issuer,no_pubkey,no_header,no_version

案例

注意:在下面的案例中,\ 表示全部输入应该在同一行。

显示证书的内容:

openssl x509 -in cert.pem -noout -text

显示证书的“Subject Alternative Name”扩展:

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 -signkey key.pem

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

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

将一个证书设置为 SSL client 可信,并修改别名为“Steve’s Class 1 CA”:

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

备注

PEM 格式所使用的首尾行:

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

(该命令)也可处理包含下述行的文件:

-----BEGIN X509 CERTIFICATE-----
-----END X509 CERTIFICATE-----

可信证书具有下面的行

-----BEGIN TRUSTED CERTIFICATE-----
-----END TRUSTED CERTIFICATE-----

对于名称的转至 UTF8 格式的转换假设 T61Strings 使用了 ISO8859-1 字符集。这并不正确,但 Netscape 和 MSIE 是这么使用的,也有很多证书这么用。所以虽然这并不正确,但它更有可能正确显示大多数证书。
-email 选项会搜索主体名以及主体替代名扩展。它仅展示不同的邮件地址:它不会多次打印相同的地址。

证书扩展

-purpose 选项检查检查证书扩展,并决定证书能用在什么方面。实际执行检查的过程非常的复杂,并充满了 hack 和 workaround,来处理损坏的证书和软件。
相同的代码也使用在了检查一系列非可信证书上,所以该节可以用于检查一条证书链是否被拒绝。
basicConstraints 扩展的 CA 标旗用于决定一个证书是否可以作为 CA。若 CA 标旗为真,则它是一个 CA,否则它不是 CA。全体 CA 都应该具有值为真的 CA 标旗。
若缺少 basicConstraints 扩展,那么证书被认为是“可能为 CA”,会依照证书的用途来检查其它的扩展。在这种情况下,会给出一个警告,因为该证书的确不应该作为 CA 使用:但是它依旧可以作为 CA 来使用,以绕开一些残缺的软件。
若该证书为 V1 证书(也就是不含扩展),且它是自签证书,那么它也会被当作 CA 使用,但依旧会给出一个警告:该行为作为 Verisign 根证书所产生的问题的绕行方法,因为这个根证书是 V1 自签证书。
若出现了 keyUsage 扩展,那么对于证书的用途会附加额外的限制。若出现了 keyUsage 那么必须为 CA 证书设置 keyCertSign 位。
扩展密钥使用扩展为证书的用法添加了额外的限制。若出现了该扩展(无论关键(critical)与否)那么密钥仅可被用于指定的目的。
每个测试的完全描述在下方给出。上面描述的有关于 basicConstraints 和 keyUsage 以及 V1 证书的相关内容适用于全部 CA 证书。

SSL Client

扩展密钥用法扩展必须不存在,或者包含 “web client authentication” OID。keyUsage 必须不存在,或必须设置 digitalSignature 位。Netscape 证书类型必须不存在,或者必须设置 SSL client 位。

SSL Client CA

扩展密钥用法扩展必须不存在,或者包含 “web client authentication” OID。Netscape 证书类型必须不存在,或者必须设置 SSL CA 位:当 basicConstraints 不存在时的绕行方案。

SSL Server

扩展密钥用法扩展必须不存在,或者包含 “web server authentication” OID 或者/以及 SGC 中的一个 OID。keyUsage 必须不存在,或者必须设置 digitalSignature 位或 keyEncipherment 位这两个位中的一个或全部。Netscape 证书类型必须不存在,或者设置 SSL server 位。

SSL Server CA

扩展密钥用法扩展必须不存在,或者包含 “web server authentication” OID 或者/以及 SGC 中的一个 OID。Netscape 证书类型必须不存在,或者设置 SSL CA 位:当 basicConstraints 不存在时的绕行方案。

Netscape SSL Server

要使 Netscape SSL 客户端连接至 SSL 服务器,在设置了 keyUsage 扩展的情况下,SSL 服务器必须设置了 keyEncipherment 位。但这并不总是有效,因为有些加密套件将密钥用于数字签名。其他情况下,它与普通 SSL 服务器类似。

Common S/MIME Client Tests

扩展密钥用法扩展必须不存在,或者包含 “email protection” OID。Netscape 证书类型必须不存在,或者设置了 S/MIME 位。若 Netscape 证书类型未设置 S/MIME 位,那么 SSL client 位也可以作为替代品接受,但是会提示警告:这是由于 Verisign 证书不会设置 S/MIME 位。

S/MIME Signing

相对于 common S.MIME client tests,在设置了 keyUsage 扩展后,还追加了对 digitalSignature 位或 nonRepudiation 位的检测,两者必须设置一个。

S/MIME Encryption

相对于 common S.MIME client tests,在设置了 keyUsage 扩展后,还追加了对 keyEncipherment 位的检测,该位须设置。

S/MIME CA

扩展密钥用法扩展必须不存在,或这包含了 “email protection” OID。Netscape 证书类型比如不存在,或者设置了 S/MIME CA 位:当 basicConstraints 不存在时的绕行方案。

CRL Signing

keyUsage 扩展必须不存在,或者必须设置了 CRL signing 位。

CRL Signing CA

应用通常的 CA 测试。且必须出现 basicConstraints 扩展。