OpenSSL命令--ca

用途:

该命令是模拟一个CA行为的工具。有了它,你就是一个CA,不过估计是nobody trusted CA。它能够签发证书请求文件以及生成CRL列表。它还维护着一个文本数据库,记录了所有经手颁发的证书及那些证书的状态。

用法:

[cpp]  view plain  copy
  1. 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:摘要算法:md5sha1  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撤销原因,原因可以为:unspecifiedkeyCompromiseCACompromiseaffiliationChangedsupersededcessationOfOperationcertificateHoldremoveFromCRL。这些原因区分大小写。匹配CRL中的原因有可能会造成程序迟钝。实际上,removeFromCRL不是特别的有效,因为它仅仅只能用于delta CRLs

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

-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,遇到提示,直接回车;

生成证书请求文件:

[cpp]  view plain  copy
  1. openssl req -new -out req.pem -keyout key.pem  
  2. openssl req -new -out req2.pem -keyout key2.pem  


签发一个证书请求文件:

[cpp]  view plain  copy
  1. openssl ca -in req.pem -out newcert.pem  

CA额外信息来签发证书请求文件:

[cpp]  view plain  copy
  1. openssl ca -in req.pem -extensions v3_ca -out newcert.pem  


签发证书:

[cpp]  view plain  copy
  1. 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  

撤销一个证书

[cpp]  view plain  copy
  1. openssl ca -revoke cert2.pem   

    

生成crl,设置原因、挂起处理方法

             

[cpp]  view plain  copy
  1. openssl ca -gencrl -out crl.crl  
  2.   
  3. 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

[cpp]  view plain  copy
  1. openssl ca -spkac spkac.txt  

一个SPKAC文件实例如下:

[cpp]  view plain  copy
  1. SPKAC=MIG0MGAwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAn7PDhCeV/xIxUg8V70YRxK2A5  
  2.   
  3.  CN=Steve Test  
  4.   
  5.  emailAddress=steve@openssl.org  
  6.   
  7.  0.OU=OpenSSL Group  
  8.   
  9.  1.OU=Another Group  


一个配置文件实例(与ca命令相关的字节如下):

[cpp]  view plain  copy
  1. [ ca ]  
  2.   
  3.  default_ca      = CA_default            # The default ca section  
  4.   
  5.    
  6.   
  7.  [ CA_default ]  
  8.   
  9.    
  10.   
  11.  dir            = ./demoCA              # top dir  
  12.   
  13.  database       = $dir/index.txt        # index file.  
  14.   
  15.  new_certs_dir    = $dir/newcerts         # new certs dir  
  16.   
  17.    
  18.   
  19.  certificate    = $dir/cacert.pem       # The CA cert  
  20.   
  21.  serial         = $dir/serial           # serial no file  
  22.   
  23.  private_key    = $dir/private/cakey.pem# CA private key  
  24.   
  25.  RANDFILE       = $dir/private/.rand    # random number file  
  26.   
  27.    
  28.   
  29.  default_days   = 365                   # how long to certify for  
  30.   
  31.  default_crl_days= 30                   # how long before next CRL  
  32.   
  33.  default_md     = md5                   # md to use  
  34.   
  35.    
  36.   
  37.  policy         = policy_any            # default policy  
  38.   
  39.  email_in_dn    = no                    # Don't add the email into cert DN  
  40.   
  41.    
  42.   
  43.  name_opt = ca_default                 # Subject name display option  
  44.   
  45.  cert_opt    = ca_default                 # Certificate display option  
  46.   
  47.  copy_extensions = none                          # Don't copy extensions from request  
  48.   
  49.    
  50.   
  51.  [ policy_any ]  
  52.   
  53.  countryName            = supplied  
  54.   
  55.  stateOrProvinceName    = optional  
  56.   
  57.  organizationName       = optional  
  58.   
  59.  organizationalUnitName = optional  
  60.   
  61.  commonName             = supplied  
  62.   
  63.  emailAddress           = optional  
  64.   
  65. 需要注意的是,本地的所有文件位置可以被改变的。  
  66.   
  67. /usr/local/ssl/lib/openssl.cnf - master configuration file  
  68.   
  69.  ./demoCA                       - main CA directory  
  70.   
  71.  ./demoCA/cacert.pem            - CA certificate  
  72.   
  73.  ./demoCA/private/cakey.pem     - CA private key  
  74.   
  75.  ./demoCA/serial                - CA serial number file  
  76.   
  77.  ./demoCA/serial.old            - CA serial number backup file  
  78.   
  79.  ./demoCA/index.txt             - CA text database file  
  80.   
  81.  ./demoCA/index.txt.old         - CA text database backup file  
  82.   
  83.  ./demoCA/certs                 - certificate output file  
  84.   
  85.  ./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>选项使用起来必须小心。如果没有小心,则会冒着安全的风险。例如一个证书请求包含一个CAbasicConstraints额外信息:它的值为true,并且B<copy_extensions>选项的值为B<copyall>,当一个证书已经显示了且用户没有认出它,它将传递请求为一个有效的CA证书。

在设置B<copy_extensions>选项为B<copy>时,这个选项可以被避免。在配置文件中包含basicConstraints的值为CAFALSE。则请求文件中包含basicConstraints额外信息,则将它忽略掉。

最可取的方法是包含其他额外信息的值例如B<keyUsage>来阻止一个请求供应自己的值。

附加的限制条件可以被CA证书自己放置。例如一个证书有:

basicConstraints = CA:TRUE, pathlen:0

则一个证书已经颁发,值为CA:TRUE,它将不会有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值