asn1parse命令
一、简介
asn1parse命令是一种用来诊断ASN.1结构的工具,也能用于从ASN1.1数据中提取数据。
二、语法
openssl asn1parse [-inform PEM|DER] [-in filename] [-out filename] [-noout] [-offset number] [-length number] [-i] [- structure filename] [-strparse offset]
选项说明
Usage: asn1parse [options]
Valid options are:
-help Display this summary
-inform PEM|DER input format - one of DER PEM
-in infile input file
-out outfile output file (output format is always DER)
-i indents the output
-noout do not produce any output
-offset +int offset into file
-length +int length of section in file
-oid infile file of extra oid definitions
-dump unknown data in hex form
-dlimit +int dump the first arg bytes of unknown data in hex form
-strparse val offset; a series of these can be used to 'dig'
into multiple ASN1 blob wrappings
-genstr val string to generate ASN1 structure from
-genconf val file to generate ASN1 structure from
(-inform will be ignored)
-strictpem do not attempt base64 decode outside PEM markers
-inform PEM|DER:输入内容的格式,一般为PEM(base64编码格式)和DER(是二进制格式)两种,默认为PEM。
-in filename:输入文件名,默认为标准输入。
-out filename:输出文件名,默认为标准输出。如果这个选项没有被提出,则没有数据输出。和B<-strparse>选项合并使用时,这个选项非常有用。给定一个PEM文件,采用此选项可用生成一个DER编码的文件。
-noout:不打印参数编码的版本信息。
-offset number:开始数据分析的字节偏移量,分析数据时,不一定从头开始分析,可用指定偏移量,默认从头开始分析。
-length number:需要分析数据的长度值,默认为分析到文件结束。
-i:标记实体,输出缩进标记,将一个ASN1实体下的其他对象缩进显示。此选项非默认选项,加上此选项后,显示更易看懂。
-dump:所有数据以十六进制格式显示。
dlimit number:与-dump不同,-dump显示所有的数据,而此选项只能显示由number指定数目的十六进制数据。
-oid filename:一个文件包含的附加的oids标记值。
-strparse offset:此选项也用于从一个偏移量开始来分析数据,不过,与-offset不一样。-offset分析偏移量之后的所有数据,而-strparse只用于分析一段数据,并且这种数据必须是SET或者SEQUENCE,它只分析本SET或者SEQUENCE范围的数据。
-genstr string、-genconf file:根据string、file或者用L<ASN1_generate_nconf(3)|ASN1_generate_nconf(3)>格式来产生编码数据的字符串。如果仅仅file被提供,字符串将会从默认的name字段中获取。编码后的数据通过ASN1分析来传输。
三、输出——ASN.1结构
0: d = 0 hl = 4 l = 710 cons: SEQUENCE
0 表示节点在整个文件中的偏移长度
d=0 表示节点深度
hl=4 表示节点头字节长度
l=710 表示节点数据字节长度
cons 表示该节点为结构节点,表示包含子节点或者子结构数据
prim 表示该节点为原始节点,包含数据
SEQUENCE、OCTETSTRING等都是ASN.1中定义的数据类型,具体可以参考ASN.1格式说明。
最后一个节点OCTET STRING [HEX DUMP],就是加密后的私钥数据。
四、实例
代表性的输出内容为:
此命令 读取并显示root.crt证书(证书格式为pem)里面的内容值:
- 0:d=0 hl=4 l= 681 cons: SEQUENCE
- .....
- 229:d=3 hl=3 l= 141 prim: BIT STRING
- 373:d=2 hl=3 l= 162 cons: cont [ 3 ]
- 376:d=3 hl=3 l= 159 cons: SEQUENCE
- 379:d=4 hl=2 l= 29 cons: SEQUENCE
- 381:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Subject Key Identifier
- 386:d=5 hl=2 l= 22 prim: OCTET STRING
- 410:d=4 hl=2 l= 112 cons: SEQUENCE
- 412:d=5 hl=2 l= 3 prim:OBJECT :X509v3 Authority Key Identifier
- 417:d=5 hl=2 l= 105 prim: OCTET STRING
- 524:d=4 hl=2 l= 12 cons: SEQUENCE
- ……
这个实例是一个自签名的证书中的一部分。每行的开始代表偏移量,为小数。B<d=XX>表示的是此项的深度,深度是根据SET或 SEQUENCE的范围来递增的。B<hl=XX>给出的是目前ASN.1类型的头长度(标记和长度八位组)。B<l=XX>给出了内容长度。B<prim>表示的是OBJECT表示的是ASN1类型;:sha1WithRSAEncryption表示oid。
B<-i>选项可以被用于设置输出的可读性操作。
一些ASN.1结构的知识需要在输出中翻译。
在这个实例中,BIT STRING在第229列中代表证书公钥值。可以用选项B<-strparse 229>来检查值:
- 0:d=0 hl=3 l= 137 cons: SEQUENCE
- 3:d=1 hl=3 l= 129 prim: INTEGER :E5D21E1F5C8D208EA7A2166C7FAF9F6BDF2059669C60876DDB70840F1A5AAFA59699FE471F379F1DD6A487E7D5409AB6A88D4A9746E24B91D8CF55DB3521015460C8EDE44EE8A4189F7A7BE77D6CD3A9AF2696F486855CF58BF0EDF2B4068058C7A947F52548DDF7E15E96B385F86422BEA9064A3EE9E1158A56E4A6F47E5897
- 135:d=1 hl=2 l= 3 prim: INTEGER: 010001
注意:
如果一个OID不是OpenSSL的内部表中一部分,它将会在数值列表中提出异议(例如1.2.3.4)。传过来的文件OID选项允许包含附加的OIDs。每一行由3列组成,第一列是数值型的OID,必须用空格隔开。第二列式一个“short name”,也要用空格隔开;最后一列依赖于这一行,他是“long time”。B<asn1parse>显示长名字。实例如下:
C<1.2.3.4 shortName A long name>
使用实例:
分析一个文件:
openssl asn1parse -in file.pem
分析一个DER文件:
openssl asn1parse -inform DER -in file.der
产生一个简单的UTF8String:
openssl asn1parse -genstr 'UTF8:Hello World'
产生并输出一个简单的UTF8String,不打印分析结果:
openssl asn1parse -genstr 'UTF8:Hello World' -noout -out utf8.der
用一个配置文件产生数据:
openssl asn1parse -genconf asn1.cnf -noout -out asn1.der
此命令除了显示上面内容外,并生成一个der编码的文件。
openssl asn1parse –in c:server.pem –out c:server.cer
此命令显示上面的内容,但是有缩进。
openssl.exe asn1parse –in c:server.pem –i
此命令从偏移量26开始分析,到结束。注意,26从前面命令的结果得到。
openssl.exe asn1parse –in c:server.pem –i –offset 26
此命令从偏移量13进行分析,分析长度为11。
openssl.exe asn1parse –in c:server.pem –i –offset 13 –length 11
ca命令
一、简介
该命令是模拟一个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命令的选项描述分为几部分来描述:
Usage: ca [options]
Valid options are:
-help Display this summary
-verbose Verbose output during processing
-config val A config file
-name val The particular CA definition to use
-subj val Use arg instead of request's subject
-utf8 Input characters are UTF8 (default ASCII)
-create_serial If reading serial fails, create a new random serial
-multivalue-rdn Enable support for multivalued RDNs
-startdate val Cert notBefore, YYMMDDHHMMSSZ
-enddate val YYMMDDHHMMSSZ cert notAfter (overrides -days)
-days +int Number of days to certify the cert for
-md val md to use; one of md2, md5, sha or sha1
-policy val The CA 'policy' to support
-keyfile val Private key
-keyform format Private key file format (PEM or ENGINE)
-passin val Input file pass phrase source
-key val Key to decode the private key if it is encrypted
-cert infile The CA cert
-selfsign Sign a cert with the key associated with it
-in infile The input PEM encoded cert request(s)
-out outfile Where to put the output file(s)
-outdir dir Where to put output cert
-sigopt val Signature parameter in n:v form
-notext Do not print the generated certificate
-batch Don't ask questions
-preserveDN Don't re-order the DN
-noemailDN Don't add the EMAIL field to the DN
-gencrl Generate a new CRL
-msie_hack msie modifications to handle all those universal strings
-crldays +int Days until the next CRL is due
-crlhours +int Hours until the next CRL is due
-crlsec +int Seconds until the next CRL is due
-infiles The last argument, requests to process
-ss_cert infile File contains a self signed cert to sign
-spkac infile File contains DN and signed public key and challenge
-revoke infile Revoke a cert (given in file)
-valid val Add a Valid(not-revoked) DB entry about a cert (given in file)
-extensions val Extension section (override value in config file)
-extfile infile Configuration file with X509v3 extensions to add
-status val Shows cert status given the serial number
-updatedb Updates db for expired cert
-crlexts val CRL extension section (override value in config file)
-crl_reason val revocation reason
-crl_hold val the hold instruction, an OID. Sets revocation reason to certificateHold
-crl_compromise val sets compromise time to val and the revocation reason to keyCompromise
-crl_CA_compromise val sets compromise time to val and the revocation reason to CACompromise
-engine val Use engine, possibly a hardware device
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
emailAddress=steve@openssl.org
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,它将不会有效。
cms命令
CMS(加密消息语法)实用程序
一、用法
cms [options] cert.pem...
cert.pem... recipient certs for encryption
二、选项
-help Display this summary
-inform parm Input format SMIME (default), PEM or DER
-outform parm Output format SMIME (default), PEM or DER
-in infile Input file
-out outfile Output file
-encrypt Encrypt message
-decrypt Decrypt encrypted message
-sign Sign message
-sign_receipt Generate a signed receipt for the message
-resign Resign a signed message
-verify Verify signed message
-verify_retcode (No additional info)
-verify_receipt infile (No additional info)
-cmsout Output CMS structure
-data_out (No additional info)
-data_create (No additional info)
-digest_verify (No additional info)
-digest_create (No additional info)
-compress (No additional info)
-uncompress (No additional info)
-EncryptedData_decrypt (No additional info)
-EncryptedData_encrypt (No additional info)
-debug_decrypt (No additional info)
-text Include or delete text MIME headers
-asciicrlf (No additional info)
-nointern Don't search certificates in message for signer
-noverify Don't verify signers certificate
-nocerts Don't include signers certificate when signing
-noattr Don't include any signed attributes
-nodetach Use opaque signing
-nosmimecap Omit the SMIMECapabilities attribute
-binary Don't translate message to text
-keyid Use subject key identifier
-nosigs Don't verify message signature
-no_content_verify (No additional info)
-no_attr_verify (No additional info)
-stream Enable CMS streaming
-indef Same as -stream
-noindef Disable CMS streaming
-crlfeol Use CRLF as EOL termination instead of CR only
-noout For the -cmsout operation do not output the parsed CMS structure
-receipt_request_print Print CMS Receipt Request
-receipt_request_all (No additional info)
-receipt_request_first (No additional info)
-rctform PEM|DER Receipt file format
-certfile infile Other certificates file
-CAfile infile Trusted certificates file
-CApath dir trusted certificates directory
-no-CAfile Do not load the default certificates file
-no-CApath Do not load certificates from the default certificates directory
-content infile Supply or override content for detached signature
-print For the -cmsout operation print out all fields of the CMS structure
-secretkey val (No additional info)
-secretkeyid val (No additional info)
-pwri_password val (No additional info)
-econtent_type val (No additional info)
-rand val Load the file(s) into the random number generator
-passin val Input file pass phrase source
-to val To address
-from val From address
-subject val Subject
-signer val Signer certificate file
-recip infile Recipient cert file for decryption
-certsout outfile Certificate output file
-md val Digest algorithm to use when signing or resigning
-inkey val Input private key (if not signer or recipient)
-keyform format Input private key format (PEM or ENGINE)
-keyopt val Set public key parameters as n:v pairs
-receipt_request_from val (No additional info)
-receipt_request_to val (No additional info)
-* Any supported cipher
-policy val adds policy to the acceptable policy set
-purpose val certificate chain purpose
-verify_name val verification policy name
-verify_depth int chain depth limit
-auth_level int chain authentication security level
-attime intmax verification epoch time
-verify_hostname val expected peer hostname
-verify_email val expected peer email
-verify_ip val expected peer IP address
-ignore_critical permit unhandled critical extensions
-issuer_checks (deprecated)
-crl_check check leaf certificate revocation
-crl_check_all check full chain revocation
-policy_check perform rfc5280 policy checks
-explicit_policy set policy variable require-explicit-policy
-inhibit_any set policy variable inhibit-any-policy
-inhibit_map set policy variable inhibit-policy-mapping
-x509_strict disable certificate compatibility work-arounds
-extended_crl enable extended CRL features
-use_deltas use delta CRLs
-policy_print print policy processing diagnostics
-check_ss_sig check root CA self-signatures
-trusted_first search trust store first (default)
-suiteB_128_only Suite B 128-bit-only mode
-suiteB_128 Suite B 128-bit mode allowing 192-bit algorithms
-suiteB_192 Suite B 192-bit-only mode
-partial_chain accept chains anchored by intermediate trust-store CAs
-no_alt_chains (deprecated)
-no_check_time ignore certificate validity time
-allow_proxy_certs allow the use of proxy certificates
-aes128-wrap Use AES128 to wrap key
-aes192-wrap Use AES192 to wrap key
-aes256-wrap Use AES256 to wrap key
-sms4-wrap Use SMS4 to wrap key
-des3-wrap Use 3DES-EDE to wrap key
-engine val Use engine e, possibly a hardware device
选项说明:
-encrypt:用接收者的证书对邮件进行加密。输入文件是需要加密的信息数据。输出文件是MIME格式的已经加密了的邮件信息值。
-decrypt:用提供者的证书和私钥文件对邮件进行解密。输入文件是MIME格式的已经加密了的邮件信息值。解密的邮件信息将会写入到输出文件中。
-sign:用提供者的证书和私钥文件对邮件进行签名。输入文件是需要签名的信息数据。输出文件是MIME格式的已经签名了的邮件信息值。
-verify:验证已经签名了的邮件。输入和输出都是已经签名了的数据。如果支持的话清除文本和不透明的签名信息值。
-cmsout:获取一个输入消息,输出一个PEM编码格式的CMS结构。
-resign:重新签名一个消息:即获取目前有可能已经被多个签名者签名的现存数据。
-data_create:创建一个CMS B<Data>类型的数据。
-data_out:输出CMS B<Data>类型的上下文。
-digest_create:创建一个CMS B< DigestedData>类型数据。
-digest_verify:验证一个CMS B< DigestedData>类型数据并输出上下文。
-compress:创建一个CMS B< CompressedData>类型数据。OpenSSL在编译时必须要包含“zlib”选项值。
-uncompress:解压缩一个CMSB< CompressedData>类型数据并输出上下文。OpenSSL在编译时必须要包含“zlib”选项值。
-EncryptedData_encrypt:用CMS B< EncrytedData >类型数据并输出上下文。用提供的对称密钥和加密算法对加密灵活的上下文进行加密。
-sign_receipt:对提供的消息产生并输出一个签名的收据。输入的消息中必须包含一个签名的收据请求信息。功能根-sign命令相似。
-verify_receipt receipt:验证从B<receipt>文件中读取的签名的收据。输入的消息必须包含一个签名的收据请求信息。功能根-verify命令相似。
-in filename:用于加密或签名的消息值。
-inform SMIME|PEM|DER:指定了CMS结构的输入格式。默认的是SMIME格式(读取一个S/MIME格式消息)。B<PEM>和B<DER>格式改变CMS结构的输入格式为PEM和DER。目前仅仅影响了CMS结构的输入格式,如果没有CMS结构则输入不会造成任何影响。
-rctform SMIME|PEM|DER:指定一个已经签名了的收据格式,以用于B<-receipt_verify>操作。
-out filename:已经被解密或验证了的MIME格式的消息。
-outform SMIME|PEM|DER:指定了CMS结构的输出格式。默认的是SMIME格式(写出一个S/MIME格式消息)。B<PEM>和 B<DER>格式改变CMS结构的输出格式为PEM和DER。目前仅仅影响了CMS结构的输入格式,如果没有CMS结构则输入不会造成任何影响。
-stream -indef:B<-stream>和 B<-indef>两个选项等价于流I/O的编码操作。
-content filename:指定了一个文件包含的分离的目录。它仅仅在B<-verify>中使用。如果CMS结构被用于分离签名值,将会有用。如果输入的格式是S/MIME则不会有效。
-text:如果加密或签名数据时,这个选项添加无格式的MIME头部的文本信息到提供的消息中。如果解密或验证则分离出头部信息:如果解密或验证签名不是一个MIMI格式的数据,则会发生错误。
-noout:对B<-cmsout>操作来说,不输出解析了的CMS结构。当和B<-print>选项合并使用的时候非常有用,因为CMS的语法将会被检查。
-print:对B<-cmsout>操作来说,打印CMS结构中的所有的域。对测试用途时这个选项非常有用。
-CAfile file:一个文件包含可信任的CA证书。仅仅用于B<-verify>命令。
-CApath dir:包含可信任CA证书的目录。仅仅用于B<-verify>命令。这个目录必须是一个标准的目录:每个CA文件的文件名为XXXX.0,XXXX为其持有者摘要值。
-md digest:当签名或放弃签名的摘要算法。如果不存在,则默认的摘要算法为SHA1。
-cipher:使用的加解密算法。例如triple DES (168字节) - B<-des3>,256字节 AES - B<-aes256>。任何标准的算法名字(用与EVP_get_cipherbyname()函数)优于一个破折号,例如B<-aes_128_cbc>。
-nointern:当验证一个消息时,证书通常包含在签名消息中。这个选项仅仅与B<-certfile>中指定的证书一起使用。无论怎样,提供的证书可以作为一个可信任的CA来使用。
-no_signer_cert_verify:不去验证签名消息中的签名证书。
-nocerts:当用签名者的证书签名的时候,一般签名者的证书将附加到签名信息后。设置此选项后,将不附加签名者的证书。这样会减少签名值的大小,但是验证签名值的时候必须从本地区复制一份签名者的证书。
-noattr:当一个消息被签名后,一系列属性将包含进去,属性包括签名时间以及支持的对称算法。设置了此选项后将不再添加属性信息。
-nosmimecap:排除签名信息中的对称算法列表,其它选项例如签名时间和目录类型始终被包含。
-binary:默认的是:输入消息是被转换了的,它的格式是"canonical",即结尾一般是CR和 LF格式。当这个选项被设置后,数据没有转换操作。当处理二进制数据的时候这个选项非常有用。
-nodetach:当签名一个消息时用不透明的签名:如果邮件代理商不支持S/MIME格式,则这个表单将抵抗邮件转换。没有这个选项,清除文本的签名将会被使用。
-certfile file:允许指定附加的证书。当签名的时候将会包含这些证书。当验证的时候需要搜寻签名者的证书。证书必须是PEM格式的。
-certsout file:包含到消息中的证书信息将会写到file中。
-signer file:一个签名证书,可以用于签名或取消签名。当多个签名者被请求时,这个选项可以被用于多次。如果一个消息将被验证并验证成功,则签名者的证书将会写入到file中。
-recip file:当解密消息的时候所使用的接受者的证书。这个证书必须要匹配接受者的消息值,如果不匹配,则会出现错误。
-keyid:用颁发者的密钥标识来标识证书,代替颁发者名字和序列号。提供者的证书必须包含密钥标识的额外信息。B<-sign>和 B<-encrypt>选项使用。
-receipt_request_all -receipt_request_first:对B<-sign>选项来说,包含一个签名的收据请求。表明请求必须被所有的请求者或者请求者的第一个所提供(它们是邮件目录而不是邮件列表)。不管B<-receipt_request_from>是否被包含。
-receipt_request_from emailaddress:对B<-sign>选项来说,包含一个签名的收据请求。添加一个接受者提供的明确的地址。
-receipt_request_to emailaddress:添加一个明确的地址,该地址是已经签名了的请求发送的地址。当请求已经被签名后这个选项必须设置。
-receipt_request_print:对B<-verify>来说,打印已经签名了的收据请求的内容。
-secretkey key:指定使用的对称密钥。该密钥必须被提供并且是16进制的,它和对称加密算法一起使用。B<-EncryptedData_encrypt>,B<-EncrryptedData_decrypt>, B<-encrypt> 和 B<-decrypt> 选项将会使用它。当被B<-encrypt>和B<-decrypt>时,提供的密钥将会用于封装或解封装内容。
-secretkeyid id:对称密钥的密钥标识符或者是B<KEKRecipientInfo>的类型值。如果B<-secretkey>被用于B<-encrypt>选项时,它必须设置。包含B<-decrypt>选项时,当试图解密B<KEKRecipientInfo>信息时,如果密钥值没有被提供,则id值将会被用于查找密钥值。
-econtent_type type:如果没有提供B<Data>类型,则设置压缩内容的类型值为type。Type元素可以是任何有效的OID,该OID可以是文本格式也可以是数字形式。
-inkey file:签名或验证签名时所使用的私钥。它必须匹配相应的证书。如果这个选项没有被指定,私钥必须包含在B<-recip>或 B<-signer>指定的证书文件中。当签名时,这个选项可以使用多次来指定连续的密钥值。
-passin arg:私钥密码保护口令。
-rand file(s):随机种子产生文件。
cert.pem...:一个或多个消息收件人的证书,当签名一个消息时使用。
-to, -from, -subject:相关的邮件头部信息值。它们将包含在签名值之外并手动添加它们。签名时很多S/MIME邮件客户端可以根据表单中的地址信息来检查签名者的证书邮件地址。
-purpose, -ignore_critical, -issuer_checks, -crl_check, -crl_check_all, -policy_check, -extended_crl, -x509_strict, -policy -check_ss_sig:设置证书链的验证选项值。
注意:
MIME格式的消息必须在头部和输出中没有任何空白行的时候发送。一些邮件程序会自动的添加一行空白行。能够改变格式的一种方法是立即对发送邮件进行管道处理。
提供的消息必须是签名了的或是加密了的。它们必须包含MIME头部信息或S/MIME客户端希望显示的属性值。你可以使用B<-text>选项来自动地添加清楚地文本头部信息值。
一个"signed and encrypted"消息是其中一种,签名消息既是加密消息。这个就可以产生加密消息。
程序的版本仅仅允许一个签名者对应一个消息,但是接收到的消息可以用多个签名者来验证。如果一个消息包含多个签名者,则一些S/MIME客户端将会阻塞。有可能的是签名一个已经签名的消息时,去进行“平行的”签名。
在S/MIME客户端中,B<-encrypt>和 B<-decrypt>选项反射处理普通的使用方式。严格的来说,CMS处理数据:CMS加密的数据将会用于其它用途。
当添加一个新的签名者时,B<-resign>选项用一个现存的消息进行摘要。这就意味着对现存的签名者来说,属性有可能被提出多次。
B<-stream> 和 B<-indef>选项使实验的流I/O称为可能。对一个DER编码的结果来说,它用不定长的长度结构来编码则不管DER。如果内容没有被分离,流处理被B<-encrypt>操作和B<-sign>操作所支持。
流一般是用于B<-sign> 操作,用来分离数据。
退出程序的返回值:
0:操作成功。
1:当解析命令选项时出现一个错误。
2:输入文件中的一个文件不能够被读取。
3:当创建一个CMS文件或读取一个MIME消息时发生一个错误。
4:解密或验证签名时发生错误。
5:消息已经验证通过,但写出签名者的证书时出错。
下面的选项兼容PKCS#7格式:
B<smime>命令仅仅处理老的PKCS#7格式的内容。CMS命令支持用密码写的消息语法格式。消息中一些有用的特性不能够被应用程序(仅仅支持老的格式)所处理。它们的详细说明如下:
B<-keyid>用于B<-sign>或 B<-encrypt>选项。
B<-outform PEM>用不同的头部。
当用B<-encrypt>选项时使用B<-secretkey>选项。
实例:
创建一个清除文本的签名消息值:
openssl cms -sign -in message.txt -text -out mail.msg -signer mycert.pem
创建一个不透明的签名消息值:
openssl cms -sign -in message.txt -text -out mail.msg -nodetach -signer mycert.pem
创建一个签名值,包含很多附加的证书和从其它文件读取私钥值:
openssl cms -sign -in in.txt -text -out mail.msg -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem
用两个签名者、用密钥标识符签名一个消息:
openssl cms -sign -in message.txt -text -out mail.msg
-signer mycert.pem -signer othercert.pem -keyid
在Unix环境下发生一个签名了的消息,包含头部:
openssl cms -sign -in in.txt -text -signer mycert.pem
-from steve@openssl.org -to someone@somewhere
-subject "Signed message" | sendmail someone@somewhere
验证一个消息,如果验证成功,则提取出签名者的证书:
openssl cms -verify -in mail.msg -signer user.pem -out signedtext.txt
发送用3DES加密了的邮件:
openssl cms -encrypt -in in.txt -from steve@openssl.org
-to someone@somewhere -subject "Encrypted message"
-des3 user.pem -out mail.msg
签名并加密邮件(注意的是加密的命令不会包含B<-text>选项,因为已经加密了的信息已经包含MIME头部信息值):
openssl cms -sign -in ml.txt -signer my.pem -text
| openssl cms -encrypt -out mail.msg
-from steve@openssl.org -to someone@somewhere
-subject "Signed and Encrypted message" -des3 user.pem
解密一个邮件:
openssl cms -decrypt -in mail.msg -recip mycert.pem -inkey key.pem
64编码签名数据:
openssl cms -verify -inform DER -in signature.der -content content.txt
128字节的Camellia算法加密信息:
openssl cms -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem
为一个现存的消息添加一个签名者:
openssl cms -resign -in mail.msg -signer newsign.pem -out mail2.msg
BUGs:
MIME分离不是非常灵活:似乎是处理更多的被丢弃的消息,还有可能会造成阻塞。
现在的代码仅仅能够写出签名者的证书到文件:如果签名者有一个加密证书,则它必须手动地导出。则有一些探索的功能:怎样保存加密证书。
理想的是有一个数据库来维护每个邮件地址的证书信息。
现在的代码不允许取出SMIMECapabilities签名属性中的对称加密算法。这就意味着只能手动的改正加密算法。必须将允许的算法装进一个数据库。
没有废除列表来检查签名者的证书。
gost
一、用法:
gost [options] [file...]
二、具体选项:
file... files to digest (default is stdin)
-help Display this summary
-c Print the digest with separating colons
-r Print the digest in coreutils format
-rand val Use file(s) containing random data to seed RNG or an EGD sock
-out outfile Output to filename rather than stdout
-passin val Input file pass phrase source
-sign val Sign digest using private key
-verify val Verify a signature using public key
-prverify val Verify a signature using private key
-signature infile File with signature to verify
-keyform format Key file format (PEM or ENGINE)
-hex Print as hex dump
-binary Print in binary form
-d Print debug info
-debug Print debug info
-fips-fingerprint Compute HMAC with the key used in OpenSSL-FIPS fingerprint
-hmac val Create hashed MAC with key
-mac val Create MAC (not necessarily HMAC)
-sigopt val Signature parameter in n:v form
-macopt val MAC algorithm parameters in n:v form or key
-* Any supported digest
-engine val Use engine e, possibly a hardware device
-engine_impl Also use engine given by -engine for digest operations
-config val A config file
三、实例
aes-128-cbc
一、用法:
aes-128-cbc [options]
二、具体选项:
-help Display this summary
-ciphers List ciphers
-in infile Input file
-out outfile Output file
-pass val Passphrase source
-e Encrypt
-d Decrypt
-p Print the iv/key
-P Print the iv/key and exit
-v Verbose output
-nopad Disable standard block padding
-salt Use salt in the KDF (default)
-nosalt Do not use salt in the KDF
-debug Print debug info
-a Base64 encode/decode, depending on encryption flag
-base64 Same as option -a
-A Used with -[base64|a] to specify base64 buffer as a single line
-bufsize val Buffer size
-k val Passphrase
-kfile infile Read passphrase from file
-K val Raw key, in hex
-S val Salt, in hex
-iv val IV in hex
-md val Use specified digest to create a key from the passphrase
-none Don't encrypt
-* Any supported cipher
-engine val Use engine, possibly a hardware device
-config val A config file
三、实例
- 将要加密的内容输入到plain.txt
echo "1234567890abc" > plain.txt - 使用openssl加密. -p 表示打印出加密用的salt, key, iv. salt就是所谓的加盐, 防止同样的内容产生同样的加密数据. iv和key是openssl 的cbc模式需要的参数. openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -iv f123 -K 1223 -p
salt=E0DEB1EAFE7F0000
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000 - 输出加密前和加密后内容的十六进制. 这里使用xxd和hexdump都可以.
xxd plain.txt
00000000: 3132 3334 3536 3738 3930 6162 630a 1234567890abc.
xxd encrypt.txt
00000000: c5af 18cb ddee 9923 0374 6a21 9bb6 3f99 …#.tj!..?.
解密加密后的数据
openssl aes-128-cbc -d -in encrypt.txt -out encrypt_decrypt.txt -S E0DEB1EAFE7F0000 -iv F1230000000000000000000000000000 -K 12230000000000000000000000000000
- -S salt Salt to use, specified as a hexidecimal string-salt Use a salt in the key derivation routines (default)
查看解密后的数据和原始数据是否一致
- .
xxd encrypt_decrypt.txt00000000: 3132 3334 3536 3738 3930 6162 630a 1234567890abc.
aes-128-ecb
一、用法:
aes-128-ecb [options]
二、具体选项:
-help Display this summary
-ciphers List ciphers
-in infile Input file
-out outfile Output file
-pass val Passphrase source
-e Encrypt
-d Decrypt
-p Print the iv/key
-P Print the iv/key and exit
-v Verbose output
-nopad Disable standard block padding
-salt Use salt in the KDF (default)
-nosalt Do not use salt in the KDF
-debug Print debug info
-a Base64 encode/decode, depending on encryption flag
-base64 Same as option -a
-A Used with -[base64|a] to specify base64 buffer as a single line
-bufsize val Buffer size
-k val Passphrase
-kfile infile Read passphrase from file
-K val Raw key, in hex
-S val Salt, in hex
-iv val IV in hex
-md val Use specified digest to create a key from the passphrase
-none Don't encrypt
-* Any supported cipher
-engine val Use engine, possibly a hardware device
-config val A config file
- -in filename:指定要加密的文件存放路径
- -out filename:指定加密后的文件存放路径
- -salt:自动插入一个随机数作为文件内容加密,默认选项
- -e:可以指明一种加密算法,若不指的话将使用默认加密算法
- -d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
- -a/-base64:使用-base64位编码格式
三、实例
aes-192-cbc
一、用法:
aes-192-cbc [options]
二、具体选项:
Valid options are:
-help Display this summary
-ciphers List ciphers
-in infile Input file
-out outfile Output file
-pass val Passphrase source
-e Encrypt
-d Decrypt
-p Print the iv/key
-P Print the iv/key and exit
-v Verbose output
-nopad Disable standard block padding
-salt Use salt in the KDF (default)
-nosalt Do not use salt in the KDF
-debug Print debug info
-a Base64 encode/decode, depending on encryption flag
-base64 Same as option -a
-A Used with -[base64|a] to specify base64 buffer as a single line
-bufsize val Buffer size
-k val Passphrase
-kfile infile Read passphrase from file
-K val Raw key, in hex
-S val Salt, in hex
-iv val IV in hex
-md val Use specified digest to create a key from the passphrase
-none Don't encrypt
-* Any supported cipher
-engine val Use engine, possibly a hardware device
-config val A config file
三、实例