用途:
本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等等。由于功能太多,我们按功能分成几部分来讲。
用法:
openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM] [-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename] [-out filename] [-passin arg] [-serial] [-hash] [-subject_hash] [-subject_hash_old] [-issuer_hash] [-issuer_hash_old] [-subject] [-issuer] [-nameopt option] [-email] [-ocspid] [-ocsp_uri] [-startdate] [-enddate] [-dates] [-purpose] [-modulus] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg] [-addreject arg] [-setalias arg] [-days arg] [-checkend arg] [-set_serial n] [-signkey filename] [-x509toreq] [-req] [-CA filename] [-CAkey filename] [-CAcreateserial] [-CAserial filename] [-certopt] [-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section] [-engine id]
选项说明:
输入输出等一般选项值:
-inform PEM|NET|DER:输入文件格式,DER、PEM以及NET格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。NET是为了和老的netscape server以及IIS兼容才弄出来的。他使用没有被salt过的RC4做加密算法,加密强度很底,如果不是一定要用就别用。
-outform PEM|NET|DER:输出文件格式,DER、PEM以及NET格式。同inform。
-in filename:输入的证书文件,默认为标准输入。
-out filename:输出文件,默认为标准输出。
-md2|-md5|-sha1|-mdc2:指定使用的哈希算法。缺省的是MD5于打印有关的选项。
-text:用文本方式详细打印出该证书的所有细节。
-noout:不打印出请求的编码版本信息。
-modulus:打印出公共密钥的系数值。
-serial:打印出证书的系列号。
-hash:把证书的拥有者名称的哈希值给打印出来。
-subject_hash:打印出证书拥有者信息的哈希值。
-subject_hash_old:用老式的方式打印出证书拥有者信息的哈希值。这个选项用于OpenSSL 1.0.0版本之前。
-issuer_hash:打印出证书颁发者信息的哈希值。
-issuer_hash_old:用老式的方式打印出证书颁发者信息的哈希值。这个选项用于OpenSSL 1.0.0版本之前。
-subject:打印出证书拥有者的名字。
-issuer:打印证书颁发者名字。
-nameopt option:指定用什么格式打印上俩个选项的输出。Option的值可以有一个选项或者多个选项(用逗号分开)组成。
-email:如果有,打印出证书申请者的email地址。
-startdate:打印证书的起始有效时间,即notBefore的值。
-enddate:打印证书的到期时间,即notAfter的值。
-dates:把上俩个选项都给打印出来。
-fingerprint:打印DER格式的证书的DER版本信息。
-C:用C代码风格打印结果。
-CAform DER|PEM:CA证书的格式,DER、PEM格式。默认为PEM。
-CAkeyform DER|PEM:CA密钥的ges,DER、PEM格式。默认为PEM。
-passin arg:指定私钥口令来源。
-ocspid:打印出OCSP中的颁发者信息值和证书公钥的哈希值。
-ocsp_uri:如果有的话打印出OCSP的响应地址。
与证书信任有关的选项:
一个可以信任的证书的就是一个普通证书,但有一些附加项指定其可以用于哪些用途和不可以用于哪些用途, 该证书还应该有一个"别名"。
一般来说验证一个证书的合法性的时候,相关的证书链上至少有一个证书必须是一个可以信任的证书。缺省的认为如果该证书链上的Root CA的证书可以信任,那么整条链上其他证书都可以用于任何用途。
以下的几个选项只用来验证Root CA的证书。CA在颁发证书的时候可以控制该证书的用途,比如颁发可以用于SSL client而不能用于SSL server的证书。
-trustout:打印出可以信任的证书。
-setalias arg:设置证书别名。比如你可以把一个证书叫"fordesign's certificate", 那么以后就可以使用这个别名来引用这个证书。
-alias:打印证书别名。
-clrtrust:清除证书附加项里所有有关用途允许的内容。
-clrreject:清除证书附加项里所有有关用途禁止的内容。
-addtrust arg:添加证书附加项里所有有关用途允许的内容。
-addreject arg:添加证书附加项里所有有关用途禁止的内容。
-purpose:打印出证书附加项里所有有关用途允许和用途禁止的内容。
与签名有关的otpion:
本指令可以用来处理CSR和给证书签名,就象一个CA 。
-signkey filename
使用这个选项同时必须提供私有密钥文件。这样把输入的文件变成字签名的证书。
如果输入的文件是一个证书,那么它的颁发者会被set成其拥有者。其他相关的项也会被改成符合自签名特征的证书项。
如果输入的文件是CSR, 那么就生成自签名文件。
-clrext:把证书的扩展项删除。
-keyform DER|PEM:指定使用的私有密钥的格式,DER、PEM格式。默认为PEM。
-days arg:指定证书的有效时间长短。缺省为30天。
-x509toreq:把一个证书转化成CSR。用-signkey指定私有密钥文件。
-req:缺省的认为输入文件是证书文件,set了这个选项说明输入文件是CSR。
-CA filename:指定签名用的CA的证书文件名。
-CAkey filename:指定CA私有密钥文件。如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有。
-CAserial filename:指定CA的证书系列号文件。证书系列号文件在前面介绍过,这里不重复了。
-CAcreateserial:如果没有CA系列号文件,那么本选项将生成一个。
-extensions section:指定文件中包含要增加的扩展项的section。
-extfile filename:指定包含证书扩展项的文件名。如果没有,那么生成的证书将没有任何扩展项。
-nameopt:这个选项后面的参数就是决定打印的方式,其参数有以下可选:
B<compat>:使用以前版本的格式,等于没有设置任何以下选项值。
B<RFC2253>:显示RFC2253规定的格式相兼容名字,等同于下面的命令:B<esc_2253>, B<esc_ctrl>,B<esc_msb>, B<utf8>, B<dump_nostr>, B<dump_unknown>, B<dump_der>,B<sep_comma_plus>, B<dn_rev> and B<sname>。
B<oneline>:所有名字打印在一行里面。等同于下面的命令:B<esc_2253>,B<esc_ctrl>,B<esc_msb>, B<utf8>,B<dump_nostr>,B<dump_der>,B<use_quote>,B<sep_comma_plus_space>,B<space_eq>和 B<sname>。
B<multiline>:名字里的各个字段用多行打印出来。等同于下面的命令:B<esc_ctrl>,B<esc_msb>,B<sep_multiline>,B<space_eq>, B<lname> 和 B<align>。
B<esc_2253>:用RFC2253中的域<,+"E<lt>E<gt>;>来逃避掉指定的字节请求。
B<esc_ctrl>:逃避掉控制字节。ASCII字节中的0x20 (space) a和 delete (0x7f) 字节。
B<esc_msb>:用设置MSB来避免掉字节。即ASCII字节中大于127的。
B<use_quote>:用<">字节来避免掉字节。
B<utf8>:将所有的字符串转换为utf8格式。这在RFC2253中提出。如果你幸运地有一个兼容utf8的终端就可以使用这个选项。
B<no_type>:使用了本选项,在任何方式下不去试图解释多字节。
B<show_type>:显示ASN1字节的类型。
B<dump_der>:当设置了这个选项后,用DER编码域时,则需要用十六进制来复制。
B<dump_nostr>:如果这个选项没有被设置,则复制non字符类型。
B<dump_all>:复制所有的域。
B<dump_unknown>:复制没有被OpenSSL所承认的域。
B<sep_comma_plus>, B<sep_comma_plus_space>, B<sep_semi_plus_space>,B<sep_multiline>:这些选项决定域的分隔符。第一个字节在RNDS和第二个多重的AVAs之间(多重的AVAs非常少)。选项的最后字节“space”用分隔符分开后做为结束符。
B<dn_rev>:反序DN域。这个在RFC2253中明确指出。
B<nofname>, B<sname>, B<lname>, B<oid>:这些选项允许那些域名字显示。B<nofname>一直不显示所有域的名字。B<sname>使用一个“short name”;B<lname>用长的表单。B<oid>用数值来表示OID表单。
B<align>:输出的域名字排列成一行。仅仅与B<sep_multiline>结合才能使用。
B<space_eq>:用空格代替B<=>。
Ø -certopt:这个选项后面的参数就是决定证书打印的方式,其参数有以下可选:
B<compatible>:使用以前版本的格式,等于没有设置任何以下选项值。
B<no_header>:不打印头部信息值。就是"Certificate" 和 "Data"。
B<no_version>:不打印版本信息值。
B<no_serial>:不打印序列号。
B<no_signame>:不打印使用的签名算法值。
B<no_validity>:不打印证书的有效期。即B<notBefore> 和 B<notAfter> 域。
B<no_subject>:不打印申请者的信息值。
B<no_issuer>:不打印颁发者信息值。
B<no_pubkey>:不打印公钥值。
B<no_sigdump>:不提供一个16进制的证书签名值。
B<no_aux>:不打印证书的可信任信息值。
B<no_extensions>:不打印任何X509V3的额外信息值。
B<ext_default>:保持额外信息的行为:打印不支持的证书的额外信息。
B<ext_error>:打印一个错误信息值。
B<ext_parse>:用ASN1分析不支持的额外信息。
B<ext_dump>:十六进制显示不支持的额外信息。
B<ca_default>:这个值用于B<ca>命令。等同于B<no_issuer>, B<no_pubkey>, B<no_header>,B<no_version>, B<no_sigdump> and B<no_signame>。
实例:
显示一个证书的上下文信息:
openssl x509 -in cert.pem -noout –text
显示证书的序列号:
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
显示证书的MD5值:
openssl x509 -in cert.pem -noout -fingerprint
显示证书的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
用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
注意:
PEM格式用的头部和尾部为:
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
也有可能为:
-----BEGIN X509 CERTIFICATE-----
-----END X509 CERTIFICATE-----
可信任的证书有以下行:
-----BEGIN TRUSTED CERTIFICATE-----
-----END TRUSTED CERTIFICATE-----
转换为UTF8格式的过程中,name选项将会使用ISO8859-1字节来替换T61Strings。对Netscape和MSIE格式来说,这是个错误。
B<-fingerprint>选项获取DER格式的证书摘要值。这个操作一般叫做“fingerprint”。证书的fingerprint摘要值的本质是:对该证书是独特的。如果两个证书有相同的摘要值,则这两个证书内容肯定相同。
Netscape格式的证书摘要算法为MD5,MSIE格式的证书摘要算法为SHA1。
B<-email>选项查询申请者信息值和申请者的额外信息值。唯一的email地址将会被打印:不会打印同一地址多次。
证书的额外信息值:
B<-purpose>选项检查证书的额外信息值和决定证书的用途。实际上的检查是复杂的,包含狠毒哦工作区,要检查他们是否是不合法的证书和软件。
在证书链中,当验证不信任的证书也将使用同样的代码。因为这个字段对验证代码已经拒绝了的证书链来说非常有用。
额外的CA标记basicConstraints将会决定证书是否可以作为CA证书来使用。如果这个标记为true,则可以作为一个CA,如果不为true,则不能够作为CA。B<All>中的CA列表中的CA的这个标记必须为true。
如果缺少basicConstraints信息值,则这个证书有可能是CA。将会给出一个警告信息,因为该证书没有被当做一个CA:无论怎样,允许一个CA证书工作在一些坏的软件中。
如果证书是一个V1证书(没有额外信息值),并且是自签名证书,它会被假设为一个CA,但是会给出一个警告:这是一个有问题的根证书,该证书是一个自签名的V1证书。
如果密钥用法额外信息存在,则附加的约束将会作用到该证书上。如果密钥用法额外信息存在,则一个CA证书必须有keyCertSign字节数被设置。
如果扩展密钥用法存在,则附加的约束将会作用到该证书上。如果扩展密钥用法存在,密钥仅仅能够用于指定的证书用途。
对每个测试有一个完整的描述,如下:
B<SSL Client>:扩展密钥用法必须不存在或包含“web client authentication”OID值。密钥用法必须不存在或者必须要设置digitalSignature字节。Netscape类型必须不存在或者必须要设置SSL Client字节。
B<SSL Client CA>:扩展密钥用法必须不存在或包含“web client authentication”OID值。Netscape类型必须不存在或者必须要设置SSL Client字节:如果basicConstraints额外信息不存在,它将会使用。
B<SSL Server>:扩展密钥用法必须不存在或包含“web server authentication”OID值。密钥用法必须不存在或者必须有digitalSignature,keyEncipherment设置或者两者都要设置。Netscape类型必须不存在或者必须要设置SSL Server字节。
B<SSL Server CA>:扩展密钥用法必须不存在或包含“web server authentication”OID值。Netscape类型必须不存在或者必须要设置SSL Server字节:如果basicConstraints额外信息不存在,它将会使用。
B<Netscape SSL Server>:如果密钥用法存在,Netscape格式的SSL 客户端必须要有keyEncipherment字节被设置后才能连接到服务器。这个选项不是有效的因为一些算法套件要用密钥进行数字签名。要不然就和普通的SSL Server一样。
B<Common S/MIME Client Tests>:扩展密钥用法必须不存在或包含“email protection”OID值。Netscape类型必须不存在或者必须要设置S/MIME字节。如果在Netscape 格式证书中,S/MIME字节没有被设置,SSL client字节将会默许作为一个可供选择。但是一个警告将会显示:这是因为一些证书没有设置S/MIME字节。
B<S/MIME Signing>:如果该扩展密钥用法存在,则普通的S/MIME客户端必须设置digitalSignature字节。
B<S/MIME Encryption>:如果该扩展密钥用法存在,则普通的S/MIME客户端必须设置keyEncipherment字节。
B<S/MIME CA>:扩展密钥用法必须不存在或包含“email protection”OID值。Netscape类型必须不存在或者必须要设置S/MIME CA字节:如果basicConstraints额外信息不存在,它将会使用。
B<CRL Signing>:扩展密钥用法必须不存在或或者必须要设置CRL signing字节。
B<CRL Signing CA>:普通CA测试申请。
BUGs:
证书中的额外信息将不会被转换成证书请求文件。
如果用错误的私钥或者不一致的选项将会产生一个无效的证书或请求文件。