用途:
该命令是模拟一个CA行为的工具。有了它,你就是一个CA,不过估计是nobody trusted CA。它能够签发证书请求文件以及生成CRL列表。它还维护着一个文本数据库,记录了所有经手颁发的证书及那些证书的状态。
用法:
openssl ca [-verbose] [-config filename] [-name section] [-gencrl] [-revoke file][-crl_reason reason] [-crl_hold instruction] [-crl_compromise time] [-crl_CA_compromise time ] [ -subj subj] [-crldays days] [-crlhours hours] [-crlexts section] [-startdate date] [-enddate date][-days arg] [-md arg] [-policy arg] [-keyfile arg] [-keyform arg] [-key arg] [-passin arg] [-cert file][-selfsign] [-in file] [-out file] [-notext] [-outdir dir] [-infiles] [-spkac file] [-ss_cert file] [-preserveDN] [-batch] [-msie_hack] [-extensions section][-utf8] [-create_serial] [-multivalue-rdn] [-sigopt] [-noemailDN][ -crlsec] [-extfile file] [-updatedb] [ -engine id ]
选项说明:
CA命令的选项描述分为几部分来描述:
CA选项操作:
-config filename:指定配置文件,此配置文件中包含了证书存放路径、私钥和生成证书控制等信息。如果默认安装openssl,配置文件在/usr/local/ssl/路径下。我们可以先用apps目录下的CA.sh或者CA.pl脚本来建立环境:sh CA.sh -newca,输入后回车就会生成一个demonCA的目录。
-name section:替换配置文件指定的default_ca所表示的内容。
-in file:输入的文件,被用于CA中心签名的证书请求文件路径。
-ss_cert file:指定需要由CA签发的自签名证书路径。
-spkac file:被用于CA签名的文件,里面包含一个Netscape格式的证书公钥值、挑战、附加的域值。
-infiles:处理多个证书请求文件,此选项必须放在最后,此选项后的多个输入都被当作是证书请求文件。
-out file:签名后的证书文件名,不设置的话是默认输出;证书的细节也会给写进去。
-outdir dir:设置证书的输出路径。写出的证书名就是该证书的系列号,后缀是.pem。
-cert file:指定CA文件。
-keyfile arg:指定签名请求文件的私钥文件。
-keyform arg:证书私钥文件的格式,pem以及der。
-key arg:指定私钥解密口令。在有的系统上(Unix),可以用ps看到你输入的指令,所以这个参数要小心点用。
-selfsign:是表明颁发者的密钥(由B<-keyfile)给定)来签名证书请求文件。证书请求文件被不同的密钥所签名则忽略掉。如果B<-spkac>, B<-ss_cert> or B<-gencrl>给定了值,则B<-selfsign>将会被忽略。
-passin arg:指定私钥口令来源。
-verbose:打印附加信息值。
-notext:在证书文件中,不输出文本格式的证书信息。
-startdate date:设置证书生效起始时间,采用UTCTime格式:YYMMDDHHMMSSZ。
-enddate date:设置证书失效时间,采用UTCTime格式:YYMMDDHHMMSSZ。
-days arg:设置证书有效期,arg为天数。
-md arg:摘要算法:md5、sha1 或 mdc2。这个选项应用于CRLs。
-policy arg:指定CA策略,arg为配置文件中的策略段。
-msie_hack:这是一个很古老的选项来使B
-preserveDN:证书中的DN顺序由配置文件来决定,如果设置此选项,则证书中DN的顺序与请求文件一致。
-noemailDN:如果在请求文件中的DN存在的话,证书的DN可以包含EMAIL域。无论怎样是一个很少的政策来设置证书中的邮件信息值。当这个选项设置后,EMAIL域将从证书申请者的信息中移除,然后设置到额外信息中。目前很少使用。
-batch:设置为批处理的模式,在这个模式中,没有问题会被问,所有的证书请求文件会被自动的颁发。
-extensions section:当一个证书被颁发了,配置文件中的这个字段两会添加到证书中。如果没有如果没有扩展信息字段被提出,则将会创建一个V1格式的证书。如果额外信息字段被提出(即使为空),则创建一个V3格式的证书。可以查看wL
-extfile file:附加的证书扩展项信息值。
-engine id:指定硬件引擎。
-subj subj:证书拥有者的信息值,取代证书请求文件中的申请者的信息值。格式必须为/CN=cn/O=test/OU=t/cn=forxy,忽略空格已经\后的字符。
-utf8:表明任何输入都必须是utf8编码,默认为ASCII编码。这就意味着用户的终端输入和配置文件都必须是有效的UTF8字符串。
-multivalue-rdn:当采用-subj参数时,支持多值RDN,比如:DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe。如果-multivalue-rdn没有被使用,UID的值为123456+CN=John Doe。
-create_serial:是否创建证书序列号。
-sigopt:签名选项值。
CRL操作:
-gencrl:这个选项根据信息的索引文件来生成CRL文件。
-crldays days:设置下次CRL发布时间,days为下次发布时间距现在的天数。即设置的是CRL中的nextUpdate域的值。
-crlhours hours:设置下次CRL发布时间,hours为下次发布时间距现在的小时数。
-revoke file:要撤销证书,file文件中包含了证书。
-crl_reason reason:设置CRLv2撤销原因,原因可以为:unspecified、keyCompromise、CACompromise、affiliationChanged、superseded、cessationOfOperation、certificateHold和removeFromCRL。这些原因区分大小写。匹配CRL中的原因有可能会造成程序迟钝。实际上,removeFromCRL不是特别的有效,因为它仅仅只能用于delta CRLs。
- crl_hold instruction:当crl撤销原因为certificateHold时(证书挂起),采用此项来指定用户行为。instruction的值可以是:holdInstructionNone、holdInstructionCallIssuer和holdInstructionReject。比如用选项:-crl_hold holdInstructionReject时,指明用户必须拒绝挂起的证书。
-crl_compromise time:当crl撤销原因为keyCompromise时(密钥泄露),设置密钥泄露时间time。Time 采用通用时间格式:YYYYMMDDHHMMSSZ。
-crl_CA_compromise time:当crl撤销原因为CACompromise时(CA被破坏,设置其时间,格式同-crl_compromise time。
-crlexts section:指定CRL扩展项。section为配置文件中的段,如果不提供crl扩展项段,则生成第一版本的crl,如果提供,则生成第二版本的crl。
配置文件选项:
对ca命令来说,配置文件中的字段包含选项如下:如果B<-name>命令行选项被使用,则字段名字被使用。否则配置文件中的字段必须在B
RANDFILE
Preserve
msie_hack
例外的是B
很多配置文件中的选项时命令行选项。即配置文件中的选项被使用,就是使用命令行命令。一个选项将被作为命令来描述,它们必须在配置文件或命令行中被提出使用。
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
POLICY格式:
POLICY字段由一些列相似证书的DN域的变量组成。如果它的值是“match”,则域值必须在证书中匹配相同的域值。如果它的值为"supplied",则它必须被提出。如果它的值为"optional",有可能会被提出。在policy字段中任何域不被提及则默默地删除掉,除非B<-preserveDN>选项被提出,但是这就会被当做一个故意的行为。
SPACK格式:
输入的B<-spkac>命令行选项是一个NetScape格式已经签名了的公钥和一个挑战。它通常是来源于B
这个文件必须包含变量SPKACS来设置SPKAC的值,也可以作为一个名字对来组成DN的一个部件。如果米需要包含同样地组件两次,可以在这之前添加一个数字或一个“.”。
实例:
需要注意的是,这些实例是基于CA目录结构已经建立好和相关的文件已经存在。CA目录通常包含一个创建的CA证书、私钥(用于B
建CA:
在apps目录下sh ca.sh -newca 生成新CA,遇到提示,直接回车;
生成证书请求文件:
openssl req -new -out req.pem -keyout key.pem
openssl req -new -out req2.pem -keyout key2.pem
签发一个证书请求文件:
openssl ca -in req.pem -out newcert.pem
用CA额外信息来签发证书请求文件:
openssl ca -in req.pem -extensions v3_ca -out newcert.pem
签发证书:
openssl ca -config /usr/local/ssl/openssl.cnf -name CA_default -days 365 -md sha1 -policy policy_anything -cert demoCA/cacert.pem -in req.pem -out cert1.pem -preserveDN -noemailDN -subj /CN=CN/O=JS/OU=WX/cn=myname -extensions myexts
撤销一个证书
openssl ca -revoke cert2.pem
生成crl,设置原因、挂起处理方法
openssl ca -gencrl -out crl.crl
openssl ca -gencrl -crl_reason keyCompromise -crl_compromise 20010101030303Z -crl_hold holdInstructionReject -crl_CA_compromise 20020101030303Z -crldays 10 -out crl2.crl
生成一个crl时需要一个crlnumber,它是一个文本文件,内容为数字,比如:03。
验证一个Netscape格式的SPKAC:
openssl ca -spkac spkac.txt
一个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
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
环境变量:
B
限制:
文本数据库主题文件是一个处理的一部分,与固定值不同,它有可能会崩溃。理论上它有可能根据颁发者的证书和一个现存的CRL来重新构建主题文件:无论怎样限制没有选项来进行此项操作。
V2 CRL的特点就像一个三角CRLs,不被支持。
即使多个请求可以被输入和被处理,始终只能包含一个SPKAC或者自签名证书。
BUGS:
如果大量的证书被提出,则内存文本数据库会有问题发生。这就意味着者数据库将会在内存中保留。
CA命令实际上需要重写或实际上函数暴露,当一个命令或者借口等级是一个友好的实体,它可以适当的处理事情。脚本B
在请求文件中没有提出来的域在policy中被默默的删除。如果使用了B<-preserveDN>选项这件事情将不会发生。为了实施在DN中不包含EMAIL域,在RFC中建议使用B<-noemailDN>选项。
警告:
CA命令式古怪的也不友好。
CA命令相当于是一个怎么操作CA的一个实例。它可以作为一个CA中心来使用。
CA命令是一个有效的单一的用户命令:在各种各样的文件中它没有上锁,试图运行更多,CA命令在一些数据库上有一些不可预料的结果。
B
在设置B
最可取的方法是包含其他额外信息的值例如B
附加的限制条件可以被CA证书自己放置。例如一个证书有:
basicConstraints = CA:TRUE, pathlen:0
则一个证书已经颁发,值为CA:TRUE,它将不会有效。