用途:
该命令是模拟一个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<ca>支持很老的IE证书等级控制“certenr3”。它用UniversalStrings来表明所有事情。目前很少使用。
-preserveDN:证书中的DN顺序由配置文件来决定,如果设置此选项,则证书中DN的顺序与请求文件一致。
-noemailDN:如果在请求文件中的DN存在的话,证书的DN可以包含EMAIL域。无论怎样是一个很少的政策来设置证书中的邮件信息值。当这个选项设置后,EMAIL域将从证书申请者的信息中移除,然后设置到额外信息中。目前很少使用。
-batch:设置为批处理的模式,在这个模式中,没有问题会被问,所有的证书请求文件会被自动的颁发。
-extensions section:当一个证书被颁发了,配置文件中的这个字段两会添加到证书中。如果没有如果没有扩展信息字段被提出,则将会创建一个V1格式的证书。如果额外信息字段被提出(即使为空),则创建一个V3格式的证书。可以查看wL<x509v3_config(5)|x509v3_config(5)>手册来了解详细的额外信息字段格式。
-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<default_ca>选项中。除B<default_ca>之外,在CA字段中还有其它选项需要读取目录:
RANDFILE
Preserve
msie_hack
例外的是B<RANDFILE>选项,它有可能是个bug并且有可能在将来会被释放。
很多配置文件中的选项时命令行选项。即配置文件中的选项被使用,就是使用命令行命令。一个选项将被作为命令来描述,它们必须在配置文件或命令行中被提出使用。
B<oid_file>:这个指定的文件包含了附加的B<OBJECT IDENTIFIERS>。文件行由数字型的、用空格隔开的对象标识符表单、用空格隔开的短名字以及长名字组成。
B<oid_section>:它指定了一个字段,该字段配置文件中包含的额外的对象标识符。每一行由对象标识符的短名字和数字表单组成。在这个选项中,短名字和长名字都是一样的值。
B<new_certs_dir>:和B<-outdir>命令行选项一样。指定新的证书目录用于放置新地证书。
B<certificate>:和B<-cert>命令行选项一样。给出包含CA证书的目录。
B<private_key>:和B<-keyfile>命令行选项一样。给出包含CA私钥文件的目录。
B<RANDFILE>:读取和写入随机数种子信息的文件,或者是一个EGD接口。
B<default_days>:和B<-days>命令行选项一样。证书的有效期天数。
B<default_startdate>:和B<-startdate>命令行选项一样。证书有效期的开始时间。如果没有被设置,则默认的是当前时间。
B<default_enddate>:和B<-enddate> 命令行选项一样。不是这个选项就是B<default_days>(命令行也一样)必须设置。
B<default_crl_hours default_crl_days>:和B<-crlhours> 和 the B<-crldays>命令行选项一样。它们仅仅当命令行没有使用时才能够使用。为了产生一个CRL,至少其中的一个必须被设置值。
B<default_md>:和B<-md> 命令行选项一样。消息摘要算法。
B<database>:文本数据库文件的位置。这个文件必须被提出即使它为空。
B<unique_subject>:如果给出的值是B<yes>,有效的证书实体在数据库中有唯一的申请者信息值。如果给出的值为B<no>,多个有效的证书实体有可能有相同的申请者信息值。默认值是B<yes>,为了和老的版本(pre 0.9.8)相兼容。无论怎样,为了让制造一个CA证书变得容易,推荐用的值是B<no>,特别是与B<-selfsign>命令行一起使用的时候。
B<serial>:一个文本信息,包含了下一个即将使用的十六进制的证书序列号。这个文件必须被提出并且要包含一个有效的序列号。
B<crlnumber>:一个文本信息,包含了下一个即将使用的十六进制的CRL数值。如果这个文件存在,CRL中的数值将会被替代。如果这个文件被提出,则必须包含一个有效的CRL数值。
B<x509_extensions>:和B<-extensions> 命令行选项一样。
B<crl_extensions>:和B<-crlexts> 命令行选项一样。
B<preserve>: 和B<-preserveDN> 命令行选项一样。
B<email_in_dn>:和B<-noemailDN> 命令行选项一样。如果你想EMAIL域从证书DN信息中移除,就简单的设置为‘no’。如果没有被提出,则默认的是允许EMAIL域存在证书DN中。
B<msie_hack>:和B<-msie_hack>命令行选项一样。
B<policy>:和B<- policy >命令行选项一样。
B<name_opt>, B<cert_opt>:当询问用户是否签名时,这两个选项决定证书细节显示的格式。B<x509>命令中支持所有的选项,所以B<name_opt>和B<cert_opt>可以在这里使用,把B<no_signame> 和 B<no_sigdump>永久的设置除外,并不能够显示(这是因为证书签名值不能够被显示,因为在这点证书已经被签名了)。
B<copy_extensions>:决定证书请求文件中的额外信息怎么被处理。如果设置为B<none>或这个选项没有被提出,则忽视掉和不复制到证书中。如果设置为B<copy>,则请求文件中提出的任何额外信息(证书中已经有的除外)将被复制到证书中。如果设置为B<copyall>,则所有的额外信息全部复制到证书中:如果证书的额外信息值存在,则删除掉它。在使用这个命令之前,先看看警告。
POLICY格式:
POLICY字段由一些列相似证书的DN域的变量组成。如果它的值是“match”,则域值必须在证书中匹配相同的域值。如果它的值为"supplied",则它必须被提出。如果它的值为"optional",有可能会被提出。在policy字段中任何域不被提及则默默地删除掉,除非B<-preserveDN>选项被提出,但是这就会被当做一个故意的行为。
SPACK格式:
输入的B<-spkac>命令行选项是一个NetScape格式已经签名了的公钥和一个挑战。它通常是来源于B<KEYGEN>标记,并在HTML表单中创建一个新的私钥。可以用B<spkac>命令来创建SPKACS。
这个文件必须包含变量SPKACS来设置SPKAC的值,也可以作为一个名字对来组成DN的一个部件。如果米需要包含同样地组件两次,可以在这之前添加一个数字或一个“.”。
实例:
需要注意的是,这些实例是基于CA目录结构已经建立好和相关的文件已经存在。CA目录通常包含一个创建的CA证书、私钥(用于B<req>)中,一个序列号文件和一个空的主题文件。
建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<OPENSSL_CONF>文件反映了配置文件中的各个命令可以被命令行选项所改变。
限制:
文本数据库主题文件是一个处理的一部分,与固定值不同,它有可能会崩溃。理论上它有可能根据颁发者的证书和一个现存的CRL来重新构建主题文件:无论怎样限制没有选项来进行此项操作。
V2 CRL的特点就像一个三角CRLs,不被支持。
即使多个请求可以被输入和被处理,始终只能包含一个SPKAC或者自签名证书。
BUGS:
如果大量的证书被提出,则内存文本数据库会有问题发生。这就意味着者数据库将会在内存中保留。
CA命令实际上需要重写或实际上函数暴露,当一个命令或者借口等级是一个友好的实体,它可以适当的处理事情。脚本B<CA.sh>和B<CA.pl>帮助了一些但不是很多。
在请求文件中没有提出来的域在policy中被默默的删除。如果使用了B<-preserveDN>选项这件事情将不会发生。为了实施在DN中不包含EMAIL域,在RFC中建议使用B<-noemailDN>选项。
警告:
CA命令式古怪的也不友好。
CA命令相当于是一个怎么操作CA的一个实例。它可以作为一个CA中心来使用。
CA命令是一个有效的单一的用户命令:在各种各样的文件中它没有上锁,试图运行更多,CA命令在一些数据库上有一些不可预料的结果。
B<copy_extensions>选项使用起来必须小心。如果没有小心,则会冒着安全的风险。例如一个证书请求包含一个CA的basicConstraints额外信息:它的值为true,并且B<copy_extensions>选项的值为B<copyall>,当一个证书已经显示了且用户没有认出它,它将传递请求为一个有效的CA证书。
在设置B<copy_extensions>选项为B<copy>时,这个选项可以被避免。在配置文件中包含basicConstraints的值为CA:FALSE。则请求文件中包含basicConstraints额外信息,则将它忽略掉。
最可取的方法是包含其他额外信息的值例如B<keyUsage>来阻止一个请求供应自己的值。
附加的限制条件可以被CA证书自己放置。例如一个证书有:
basicConstraints = CA:TRUE, pathlen:0
则一个证书已经颁发,值为CA:TRUE,它将不会有效。