ca命令是一个小型CA系统。它能签发证书请求和生成CRL。它维护一个已签发证书状态的文本数据库。

用法:

       openssl ca [-verbose] [-config filename] [-name section] [-gencrl]

       [-revoke file] [-crl_reason reason] [-crl_hold instruction] [-crl_com

       promise time] [-crl_CA_compromise time] [-subj arg] [-crldays days]

       [-crlhours hours] [-crlexts section] [-startdate date] [-enddate date]

       [-days arg] [-md arg] [-policy arg] [-keyfile arg] [-key arg] [-passin

       arg] [-cert file] [-in file] [-out file] [-notext] [-outdir dir]

       [-infiles] [-spkac file] [-ss_cert file] [-preserveDN] [-noemailDN]

       [-batch] [-msie_hack] [-extensions section] [-extfile section] [-engine

       id] B[-utf8] [-multivalue-rdn]

选项:

       -verbose

              打印附加信息。

       -config

指定配置文件,此配置文件中包含了证书存放路径、私钥和生成证书控制等信息。如果默认安装openssl,配置文件在/usr/local/ssl/路径下。我们可以先用apps目录下的CA.sh或者CA.pl脚本来     建立环境:sh CA.sh -newca,输入后回车就会生成一个demonCA的目录。

       -name section

        替换配置文件指定的default_ca所表示的内容。比如有openssl.cnf配置如下:

        [ ca ]

              default_ca      = CA_default

              [ CA_default ]

              dir             = ./demoCA

              certs           = $dir/certs   

              crl_dir         = $dir/crl

              database        = $dir/index.txt

             

              [ my_defaultCA ]

              dir             = ./demoCA1

              certs           = $dir/certs   

              crl_dir         = $dir/crl

              database        = $dir/index.txt

              此时用户也可以采用选项来指定default_ca的值: -name my_defaultCA;

       -gencrl

              生成CRL文件。

       -revoke file

              撤销证书,file文件中包含了证书。

       -crl_reason reason

设置CRLv2撤销原因,原因可以为:unspecifiedkeyCompromiseCACompromiseaffiliationChangedsupersededcessationOfOperationcertificateHoldremoveFromCRL。这些原因区分大小写。

       -crl_hold instruction

crl撤销原因为certificateHold(证书挂起),采用此项来指定用户行为。instruction的值可以是:holdInstructionNoneholdInstructionCallIssuerholdInstructionReject。比如用选项:     -crl_hold holdInstructionReject时,指明用户必须拒绝挂起的证书。

       -crl_compromise time

                     crl撤销原因为keyCompromise(密钥泄露),设置密钥泄露时间timeTime         采用通用时间格式:YYYYMMDDHHMMSSZ

       -crl_CA_compromise time

crl撤销原因为CACompromise(CA被破坏),设置其时间,格式同-crl_compromise time

       -subj arg

              持有者参数,如/CN=cn/O=test/OU=t/cn=forxy,忽略空格已经\后的字符。

       -crldays days

              设置下次CRL发布时间,days为下次发布时间距现在的天数。

       -crlhours hours

              设置下次CRL发布时间,hours为下次发布时间距现在的小时数。

       -crlexts section

指定CRL扩展项。section为配置文件中的段,如果不提供crl扩展项段,则生成第一版本的crl,如果提供,则生成第二版本的crl

       -startdate date

              设置证书生效起始时间,采用UTCTime格式:YYMMDDHHMMSSZ

       -enddate date

              设置证书失效时间,采用UTCTime格式:YYMMDDHHMMSSZ

       -days arg

              设置证书有效期,arg为天数。

       -md arg

              设置摘要算法:md5shasha1 mdc2

       -policy arg

              指定CA策略,arg为配置文件中的策略段,比如配置文件有如下信息:

              [ ca ]

              policy          = policy_match

              [ policy_match ]

              countryName             = match

              stateOrProvinceName     = match

              organizationName        = match

              organizationalUnitName  = optional

              commonName              = supplied

              emailAddress            = optional

              [ policy_anything ]

              countryName             = optional

              stateOrProvinceName     = optional

              localityName            = optional

              organizationName        = optional

              organizationalUnitName  = optional

              commonName              = supplied

              emailAddress            = optional

此时,采用的是policy_match策略(policy=policy_match指定),用户可以设置采用policy_anything       -policy policy_anything

       -keyfile arg

              指定签发证书的私钥文件。

       -key arg

              指定私钥解密口令。

       -passin arg

              指定私钥口令来源。

       -cert file

              指定CA文件。

       -in file

              输入的证书请求文件。

       -out file

              输出文件名。

       -notext

              在证书文件中,不输出文本格式的证书信息。

       -outdir dir

              设置输出路径。

       -infiles ...

处理多个证书请求文件,此选项必须放在最后,此选项后的多个输入都被当作是证书请求文件。

       -ss_cert file

              指定需要由CA签发的自签名证书。

       -preserveDN

证书中的DN顺序由配置文件来决定,如果设置此选项,则证书中DN的顺序与请求文件一致。

       -noemailDN   

如果证书请求者DN中包含邮件项,生成的证书也将会在持有者DN中包含。但是,较好的方式是将它放入到扩展项(altName)中去,如果设置了此选项,则进行这种操作。

       -batch

              批处理,不询问用户信息。

       -msie_hack

              支持很老的IE证书请求。

       -extensions section

如果没有通过-extfile选项指定扩展项信息,section为配置文件中与扩展项有关的段,签发证书时添加section指定的扩展项(默认采用x509_extensions),如果不指定扩展,将生成第一版本的数字证书。

       -engine id

              指定硬件引擎。

       -utf8

              表明任何输入都必须是utf8编码(用户的终端输入和配置文件),默认为ASCII编码。

       -multivalue-rdn

当采用-subj参数时,支持多值RDN,比如:DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe

       示例:下面所有命令在apps目录下运行:

       1  CA

              apps目录下

              sh ca.sh -newca 生成新CA,遇到提示,直接回车;

       2)    生成证书请求

              openssl req -new -out req.pem -keyout key.pem

              openssl req -new -out req2.pem -keyout key2.pem

       3)    签发证书

              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.cnf中相关内容如下:

              [ myexts ]

              basicConstraints=CA:FALSE

              sComment        = "OpenSSL Generated Certificate test"

              subjectKeyIdentifier=hash

              authorityKeyIdentifier=keyid,issuer

              openssl ca  -cert demoCA/cacert.pem -in req2.pem -out cert2.pem

       4)    撤销一个证书

              openssl ca -revoke cert2.pem

       5)    生成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