OpenSSL 中文手册 之五 OpenSSL 简介-常用指令

openssl简介-指令verify
用法:

opensslverify【-CApathdirectory】【-CAfilefile】【-purposepurpose】【-untrustedfile】【-help】【-issuer_checks】【-verbose】【-】【certificates】

说明:

证书验证工具。[/b:258940505f]

选项
-CApathdirectory
我们信任的CA的证书存放目录。这些证书的名称应该是这样的格式:
xxxxxxxx.0(xxxxxxxx代表证书的哈希值。参看x509指令的-hash)
你也可以在目录里touch一些这样格式文件名的文件,符号连接到真正的证书。
那么这个xxxxxxxx我怎么知道怎么得到?x509指令有说明。
其实这样子就可以了:
opensslx509-hash-inserver.crt

-CAfilefile
我们信任的CA的证书,里面可以有多个CA的证书。

-untrustedfile
我们不信任的CA的证书。

-purposepurpose
证书的用途。如果这个option没有设置,那么不会对证书的CA链进行验证。

现在这个option的参数有以下几个:
sslclinet
sslserver
nssslserver
smimesign
smimeencrypt
等下会详细解释的。

-help
打印帮助信息。

-verbose

打印出详细的操作信息。

-issuer_checks
打印出我们验证的证书的签发CA的证书的之间的联系。
要一次验证多个证书,把那些证书名都写在后面就好了。

验证操作解释:
S/MIME和本指令使用完全相同的函数进行验证。
我们进行的验证和真正的验证有个根本的区别:
在我们对整个证书链进行验证的时候,即使中途有问题,我们也会验证到最后,而真实的验证一旦有一个环节出问题,那么整个验证过程就告吹。
验证操作包括几个独立的步骤。
首先建立证书链,从我们目前的证书为基础,一直上溯到RootCA的证书.
如果中间有任何问题,比如找不到某个证书的颁发者的证书,那么这个步骤就挂。有任何一个证书是字签名的,就被认为是RootCA的证书。
寻找一个证书的颁发CA也包过几个步骤。在openssl0.9.5a之前的版本,如果一个证书的颁发者和另一个证书的拥有着相同,就认为后一个证书的拥有者就是前一个证书的签名CA.
openssl0.9.6及其以后的版本中,即使上一个条件成立,还要进行更多步骤的检验。包括验证系列号等。到底有哪几个我也没看明白。
得到CA的名称之后首先去看看是否是不信任的CA,如果不是,那么才去看看是否是信任的CA.尤其是RootCA,更是必须是在信任CA列表里面。
现在得到链条上所有CA的名称和证书了,下一步是去检查第一个证书的用途是否和签发时候批准的一样。其他的证书则必须都是作为CA证书而颁发的。
证书的用途在x509指令里会详细解释。
过了第二步,现在就是检查对RootCA的信任了。可能RootCA也是每个都负责不同领域的证书签发。缺省的认为任何一个RootCA都是对任何用途的证书有签发权。
最后一步,检查整条证书链的合法性。比如是否有任何一个证书过期了?签名是否是正确的?是否真的是由该证书的颁发者签名的?
任何一步出问题,所有该证书值得怀疑,否则,证书检验通过。

如果验证操作有问题了,那么打印出来的结果可能会让人有点模糊。
一般如果出问题的话,会有类似这样子的结果打印出来:
server.pem:/C=AU/ST=Queensland/O=CryptSoftPtyLtd/CN=TestCA(1024bit)
error24at1depthlookup:invalidCAcertificate
第一行说明哪个证书出问题,后面是其拥有者的名字,包括几个字段。
第二行说明错误号,验证出错在第几层的证书,以及错误描述。
下面是错误号及其描述的详细说明,注意,有的错误虽然有定义,
但真正使用的时候永远不会出现。用unused标志.
0X509_V_OK
验证操作没有问题
2X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT
找不到该证书的颁发CA的证书。
3X509_V_ERR_UNABLE_TO_GET_CRL(unused)
找不到和该证书相关的CRL
4X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE
无法解开证书里的签名。
5X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE(unused)
无法解开CRLs的签名。
6X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY
无法得到证书里的公共密钥信息。
7X509_V_ERR_CERT_SIGNATURE_FAILURE
证书签名无效
8X509_V_ERR_CRL_SIGNATURE_FAILURE(unused)
证书相关的CRL签名无效
9X509_V_ERR_CERT_NOT_YET_VALID
证书还没有到有效开始时间
10X509_V_ERR_CRL_NOT_YET_VALID(unused)
与证书相关的CRL还没有到有效开始时间
11X509_V_ERR_CERT_HAS_EXPIRED
证书过期
12X509_V_ERR_CRL_HAS_EXPIRED(unused)
与证书相关的CRL过期
13X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD
证书的notBefore字段格式不对,就是说那个时间是非法格式。
14X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD
证书的notAfter字段格式不对,就是说那个时间是非法格式。
15X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD(unused)
CRL的lastUpdate字段格式不对。
16X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD(unused)
CRL的nextUpdate字段格式不对
17X509_V_ERR_OUT_OF_MEM
操作时候内存不够。这和证书本身没有关系。
18X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
需要验证的第一个证书就是字签名证书,而且不在信任CA证书列表中。
19X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
可以建立证书链,但在本地找不到他们的根??

:selfsignedcertificateincertificatechain
thecertificatechaincouldbebuiltupusingtheuntrustedcertificates
buttherootcouldnotbefoundlocally.
20X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
有一个证书的签发CA的证书找不到。这说明可能是你的RootCA的证书列表不齐全。
21X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
证书链只有一个item,但又不是字签名的证书。
22X509_V_ERR_CERT_CHAIN_TOO_LONG(unused)
证书链太长。
23X509_V_ERR_CERT_REVOKED(unused)
证书已经被CA宣布收回。
24X509_V_ERR_INVALID_CA
某CA的证书无效。
25X509_V_ERR_PATH_LENGTH_EXCEEDED
参数basicConstraintspathlentgh超过规定长度
26X509_V_ERR_INVALID_PURPOSE
提供的证书不能用于请求的用途。
比如链条中某个证书应该是用来做CA证书的,但证书里面的该字段说明该证书不是用做CA证书的,就是这样子的情况。
27X509_V_ERR_CERT_UNTRUSTED
RootCA的证书如果用在请求的用途是不被信任的。
28X509_V_ERR_CERT_REJECTED
CA的证书根本不可以用做请求的用途。
29X509_V_ERR_SUBJECT_ISSUER_MISMATCH
证书颁发者名称和其CA拥有者名称不相同。-issuer_checks被set的时候可以检验出来。
30X509_V_ERR_AKID_SKID_MISMATCH
证书的密钥标志和其颁发CA为其指定的密钥标志不同.
31X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH
证书系列号与起颁发CA为其指定的系列号不同。
32X509_V_ERR_KEYUSAGE_NO_CERTSIGN
某CA的证书用途不包括为其他证书签名。
50X509_V_ERR_APPLICATION_VERIFICATION
应用程序验证出错。


openssl简介-指令asn1parse

用法:opensslasn1parse[-informPEM|DER][-infilename][-outfilename]

[-noout][-offsetnumber][-lengthnumber][-i][-structurefilename]

[-strparseoffset]

用途:一个诊断工具,可以对ASN1结构的东东进行分析。[/b:710d397eff]
ASN1是什么?一个用来描述对象的标准。要解释的话,文章可以比解释openssl结构的文章更长。有兴趣的话自己去网络上找来看吧。

-informDER|PEM|TXT
输入的格式,DER是二进制格式,PEM是base64编码格式,TXT不用解释了吧

-infilename
输入文件的名称,缺省为标准输入。

-outfilename
输入文件的名称,输入一般都是DER数据。如果没这个项,就没有东西输入咯。该项一般都要和-strparse一起使用。

-noout
不要输出任何东西(不明白有什么用)

-offsetnumber
从文件的那里开始分析,看到offset就应该知道是什么意思了吧。

-lengthnumber
一共分析输入文件的长度的多少,缺省是一直分析到文件结束。

-i
根据输出的数据自动缩进。

-structurefilename
当你输入的文件包含有附加的对象标志符的时候,使用这个。
这种文件的格式在后面会介绍。

-strparseoffset
从由offset指定的偏移量开始分析ASN1对象。当你碰到一个嵌套的对象时,可以反复使用这个项来一直进到里面的结构捏出你需要的东东。
一般分析完之后输入的东东如下:
opensslasn1parse-outtemp.ans-i-informpem<server.crt

0:d=0hl=4l=881cons:SEQUENCE

4:d=1hl=4l=730cons:SEQUENCE

.......

172:d=3hl=2l=13prim:UTCTIME:000830074155Z

187:d=3hl=2l=13prim:UTCTIME:010830074155Z

202:d=2hl=3l=136cons:SEQUENCE

205:d=3hl=2l=11cons:SET

......

359:d=3hl=3l=141prim:BITSTRING

......
本例是一个自签名的证书。每一行的开始是对象在文件里的偏移量。d=xx是结构嵌套的深度。知道ASN1结构的人应该知道,每一个SET或者SEQUENCE都会让嵌套深度增加1.
hl=xx表示当前类型的header的长度。1=xx表示内容的八进制的长度。
-i可以让输出的东西容易懂一点。
如果没有ASN.1的知识,可以省略看这一章。
本例中359行就是证书里的公共密钥。可以用-strparse来看看
opensslasn1parse-outtemp.ans-i-informpem-strparse359<server.crt

0:d=0hl=3l=137cons:SEQUENCE

3:d=1hl=3l=129prim:INTEGER:C0D802B4C084B20569C619C0FDF

466EEB7980920A408D51DA22C20427AC32488665D931C41E3274912DE2F25C8CA9C97B75

415C01794B622DBEADD92DA068C140C3AD387BF5FDC9A8D2FCEE7F7F3E36B0194994FD67

07897C8969F16F6ECB3F03BF985E910817160FE5DCBF874B1C0DBD06A568E130DA7C9FE3

9FE7A7F421369

135:d=1hl=2l=3prim:INTEGER:010001
不要试图去看temp.ans的内容,是二进制来的,看不懂的。


openssl简介-指令ca

用途:
模拟CA行为的工具.有了它,你就是一个CA,不过估计是nobodytrustedCA.可以用来给各种格式的CSR签名,用来产生和维护CRL(不记得CRL是什么了?去看证书那一章).他还维护着一个文本数据库,记录了所有经手颁发的证书及那些证书的状态。
用法:
opensslca[-verbose][-configfilename][-namesection][-gencrl]

[-revokefile][-crldaysdays][-crlhourshours][-crlextssection]

[-startdatedate][-enddatedate][-daysarg][-mdarg][-policyarg]

[-keyfilearg][-keyarg][-passinarg][-certfile][-infile]

[-outfile][-notext][-outdirdir][-infiles][-spkacfile]

[-ss_certfile][-preserveDN][-batch][-msie_hack][-extensionssection][/b:f3a6bcf2f5]
哇噻,好复杂也。不过用过GCC的人应该觉得这么点flag还是小case.

-configfilename
指定使用的configure文件。

-infilename
要签名的CSR文件。

-ss_certfilename
一个有自签名的证书,需要我们CA签名,就从这里输入文件名。

-spkacfilename
这一段实在没有看懂,也没兴趣,估计和SPKAC打交道可能性不大,奉送上英文原文。
afilecontainingasingleNetscapesignedpublickeyandchallengeandadditionalfieldvaluestobesignedbytheCA.
SPKACFORMAT
Theinputtothe-spkaccommandlineoptionisaNetscapesignedpublickeyandchallenge.ThiswillusuallycomefromtheKEYGENtaginanHTMLformtocreateanewprivatekey.ItishoweverpossibletocreateSPKACsusingthespkacutility.
ThefileshouldcontainthevariableSPKACsettothevalueoftheSPKACandalsotherequiredDNcomponentsasnamevaluepairs.Ifyouneedtoincludethesamecomponenttwicethenitcanbeprecededbyanumberanda.
-infiles
如果你一次要给几个CSR签名,就用这个来输入,但记得这个选项一定要放在最后。这个项后面的所有东东都被认为是CSR文件名参数。
-outfilename
签名后的证书文件名。证书的细节也会给写进去。
-outdirdirectory
摆证书文件的目录。证书名就是该证书的系列号,后缀是.pem
-cert
CA本身的证书文件名
-keyfilefilename
CA自己的私有密钥文件
-keypassword
CA的私有密钥文件的保护密码。
在有的系统上,可以用ps看到你输入的指令,所以这个参数要小心点用。
-passinarg
也是一个输入私有密钥保护文件的保护密码的一种方式,可以是文件名,设备名或者是有名管道。程序会把该文件的第一行作为密码读入。(也蛮危险的)。
-verbose
操作过程被详细printf出来
-notext
不要把证书文件的明文内容输出到文件中去。
-startdatedate
指明证书的有效开始日期。格式是YYMMDDHHMMSSZ,同ASN1的UTCTime结构相同。
-enddatedate
指明证书的有效截止日期,格式同上。
-daysarg
指明给证书的有效时间,比如365天。
-mdalg
签名用的哈希算法,比如MD2,MD5等。
-policyarg
指定CA使用的策略。其实很简单,就是决定在你填写信息生成CSR的时候,哪些信息是我们必须的,哪些不是。看看config文件里面的policy这个item就明白了。
-msie_hack
为了和及其古老的证书版本兼容而做出的牺牲品,估计没人会用的,不解释了。
-preserveDN
和-msie_hack差不多的一个选项。
-batch
设置为批处理的模式,所有的CSR会被自动处理。
-extensionssection
我们知道一般我们都用X509格式的证书,X509也有几个版本的。如果你在这个选项后面带的那个参数在config文件里有同样名称的key,那么就颁发X509V3证书,否则颁发X509v1证书。
还有几个关于CRL的选项,但我想一般很少人会去用。我自己也没兴趣去研究。
有兴趣的自己看看英文吧。

CRLOPTIONS

-gencrl

thisoptiongeneratesaCRLbasedoninformationintheindexfile.
-crldaysnum

thenumberofdaysbeforethenextCRLisdue.Thatisthedaysfrom

nowtoplaceintheCRLnextUpdatefield.

-crlhoursnum

thenumberofhoursbeforethenextCRLisdue.

-revokefilename

afilenamecontainingacertificatetorevoke.

-crlextssection

thesectionoftheconfigurationfilecontainingCRLextensionsto

include.IfnoCRLextensionsectionispresentthenaV1CRLiscreated,

iftheCRLextensionsectionispresent(evenifitisempty)thenaV2

CRLiscreated.TheCRLextensionsspecifiedareCRLextensionsandnot

CRLentryextensions.Itshouldbenotedthatsomesoftware(forexample

Netscape)can‘thandleV2CRLs.

相信刚才大家都看到很多选项都和config文件有关,那么我们来解释一下config文件makeinstall之后,openssl会生成一个全是缺省值的config文件:openssl.cnf.也长的很,贴出来有赚篇幅之嫌,xgh不屑。简单解释一下其中与CA有关的key.
与CA有关的key都在ca这个section之中。
[ca]
default_ca=CA_default
[CA_default]
dir=./demoCA#Whereeverythingiskept
certs=$dir/certs#Wheretheissuedcertsarekept
crl_dir=$dir/crl#Wheretheissuedcrlarekept
database=$dir/index.txt#databaseindexfile.
new_certs_dir=$dir/newcerts#defaultplacefornewcerts.
certificate=$dir/cacert.pem#TheCAcertificate
serial=$dir/serial#Thecurrentserialnumber
crl=$dir/crl.pem#ThecurrentCRL
private_key=$dir/private/cakey.pem#Theprivatekey
RANDFILE=$dir/private/.rand#privaterandomnumberfile
x509_extensions=usr_cert#Theextentionstoaddtothecert
#ExtensionstoaddtoaCRL.Note:NetscapecommunicatorchokesonV2CRLs
#sothisiscommentedoutbydefaulttoleaveaV1CRL.
#crl_extensions=crl_ext
default_days=365#howlongtocertifyfor
default_crl_days=30#howlongbeforenextCRL
default_md=md5#whichmdtouse.
preserve=no#keeppassedDNordering
#Afewdifferencewayofspecifyinghowsimilartherequestshouldlook
#FortypeCA,thelistedattributesmustbethesame,andtheoptional
#andsuppliedfieldsarejustthat:-)
policy=policy_match
#FortheCApolicy
[policy_match]
countryName=match
stateOrProvinceName=match
organizationName=match
organizationalUnitName=optional
commonName=supplied
emailAddress=optional
#Atthispointintime,youmustlistallacceptable‘object‘
#types.
[policy_anything]
countryName=optional
stateOrProvinceName=optional
localityName=optional
organizationName=optional
organizationalUnitName=optional
commonName=supplied
emailAddress=optional
config文件里CAsection里面的很多key都和命令行参数是对应的。
如果某个key后面标明mandatory,那就说明这个参数是必须提供的,无论你通过命令行还是通过config文件去提供。

new_certs_dir
本key同命令行的-outdir意义相同。(mandatory)
certificate
同命令行的-cert意义相同。(mandatory)
private_key
同命令行-keyfile意义相同.(mandatory)
RANDFILE
指明一个用来读写时候产生randomkey的seed文件。具体意义在以后的RAND的API再给出解释。(不是我摆谱,我觉得重复解释没有必要)
default_days
意义和命令行的-days相同。
default_startdate
意义同命令行的-startdate相同。如果没有的话那么就使用产生证书的时间。
default_enddate
意义同命令行的-enddate相同。(mandatory).
crl_extensions
preserve
default_crl_hoursdefault_crl_days
CRL的东西.....自己都没弄懂.....
default_md
同命令行的-md意义相同.(mandatory)
database
记得index.txt是什么文件吗?不记得自己往前找。这个key就是指定index.txt的。初始化是空文件。
serialfile
指明一个txt文件,里面必须包含下一个可用的16进制数字,用来给下一个证书做系列号。(mandatory)
x509_extensions
意义同-extensions相同。
msie_hack
意义同-msie_hack相同。
policy
意义同-policy相同。自己看看这一块是怎么回事。(mandatory)
[policy_match]
countryName=match
stateOrProvinceName=match
organizationName=match
organizationalUnitName=optional
commonName=supplied
emailAddress=optional
其实如果你做过CSR就会明白,这些项就是你做CSR时候填写的那些东西麻。
后面的"match","supplied"等又是什么意思呢?"match"表示说明你填写的这一栏一定要和CA本身的证书里面的这一栏相同。supplied表示本栏必须,optional就表示本栏可以不填写。
举例时间到了:
注意,本例中我们先要在$OPENSSL/misc下面运行过CA.sh-newca,建立好相应的目录,所有需要的文件,包括CA的私有密钥文件,证书文件,系列号文件,和一个空的index文件。并且文件都已经各就各位。放心把,产生文件和文件就位都由CA.sh搞定,你要做的就是运行CA.sh-nweca就行了,甚至在你的系列号文件中还有个01,用来给下一个证书做系列号。
给一个CSR签名:
opensslca-inreq.pem-outnewcert.pem
给一个CSR签名,产生x509v3证书:
opensslca-inreq.pem-extensionsv3_ca-outnewcert.pem
同时给数个CSR签名:
opensslca-infilesreq1.pemreq2.pemreq3.pem
注意:
index.txt文件是整个处理过程中很重要的一部分,如果这玩意坏了,很难修复。理论上根据已经颁发的证书和当前的CRL当然是有办法修复的啦,但openssl没提供这个功能。:(
openssl还有俩大类指令:crl,crl2pkcs7,都是和CRL有关的,
由于我们对这个没有兴趣,所以这俩大类不做翻译和解释。


openssl简介-指令cipher
说明:cipher就是加密算法的意思。ssl的cipher主要是对称加密算法和不对称加密算法的组合。本指令是用来展示用于SSL加密算法的工具。它能够把所有openssl支持的加密算法按照一定规律排列(一般是加密强度)。这样可以用来做测试工具,决定使用什么加密算法。


用法:
opensslciphers[-v][-ssl2][-ssl3][-tls1][cipherlist]

COMMANDOPTIONS
-v
详细列出所有符合的cipher的所有细节。列出该cipher使用的ssl的版本,公共密钥交换算法,身份验证方法,对称加密算法以及哈希算法。还列出该算法是否可以出口。[/b:75001d2270]
算法出口?趁这个机会可以给大家来点革命教育。米国的加密算法研究是世界上最先进的,其国家安全局(NSA)在这方面的研究水平已经多次证明比"最先进水平"领先10到15年。他们的预算据说是每年200亿美圆。他们的数学家比你知道的还多,他们还是全世界最大的计算机硬件买家。DES就是他们最先弄出来的。到了70年代,IBM也有人在实现室弄出这个算法。都弄出来30年了,还使用的这么广泛。
该算法的最隐蔽的是一个叫S匣的东西,是一个常数矩阵。研究DES你就会知道这玩意。因为NSA和IBM都没有给出这个S匣的解释,所以大家都怀疑使用这个东西是否是NSA和IBM搞出来的后门?
一直到了90年代,才有俩个以色列人发现了原因,这个是为了对付一种叫什么微分密码分析的破解法而如此设置的,对S匣的任何改动都将使微分密码分析比较容易的将DES给K掉。S匣不仅不是后门,还是最大限度的增加了加密强度。
说远了,大意就是:老米在这方面领先的可怕。但他们怕他们的研究成果给其他国家的人用,搞的自己也破解不了,那就麻烦了。所以他们用法律规定了,一定强度以上的加密算法禁止给其他国家用。那些加密强度很弱的就可以出口。
这个故事教育我们,为了中国的崛起,还有很多路要走呐。
如果没有-v这个参数,很多cipher可能重复出现,因为他们可以同时被不同版本的SSL协议使用。

-ssl3
只列出SSLv3使用的ciphers
-ssl2
只列出SSLv2使用的ciphers
-tls1
只列出TLSv1使用的ciphers
-h,-?
打印帮助信息
cipherlist
列出一个cipherlist的详细内容。一般都这么用:
openssl-vXXXXX
这个XXXXX就是cipherlist.如果是空的话,那么XXXXX代表所有的cipher.
CIPHERLIST的格式
cipherlist由许多cipherstring组成,由冒号,逗号或者空格分隔开。但一般最常用的是用冒号。
cipherstring又是什么?
它可以仅仅包含一个cipher,比如RC4-SHA.
它也可以仅仅包含一个加密算法,比如SHA,那就表示所有用到SHA的cipher都得列出来。
你还可以使用三个符号来捏合各种不同的cipher,做出cipherstring.这三个符号是+,-,!。我想这个很好理解吧,MD5+DES表示同时使用了这俩种算法的cipher,!SHA就表示所有没有有用到SHA的cipher,IDEA-CBC就表示使用了IDEA而没有使用CBC的所有cipher.
openssl还缺省的定义了一些通用的cipherstring,有:
DEFAULT:缺省的cipherlist.
ALL:所有的cipher
HIGH,LOW,MEDIUM:分别代表高强度,中等强度和底强度的cipherlist.具体一点就是对称加密算法的key的长度分别是>128bit<128bit和==128bit的cipher.
EXP,EXPORT,EXPORT40:老米的垄断体现,前俩者代表法律允许出口的加密算法,包括40bit,56bit长度的key的算法,后者表示只有40bit长度的key的加密算法。
eNULL,NULL:表示不加密的算法。(那也叫加密算法吗?)
aNULL:不提供身份验证的加密算法。目前只有DH一种。该算法很容易被监听者,路由器等中间设备攻击,所以不提倡使用。

下表列出了SSL/TLS使用的cipher,以及openssl里面如何表示这些cipher.
SSLv3.0ciphersuitesOPENLLS表示方法

SSL_RSA_WITH_NULL_MD5NULL-MD5

SSL_RSA_WITH_NULL_SHANULL-SHA

SSL_RSA_EXPORT_WITH_RC4_40_MD5EXP-RC4-MD5

SSL_RSA_WITH_RC4_128_MD5RC4-MD5

SSL_RSA_WITH_RC4_128_SHARC4-SHA

SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5EXP-RC2-CBC-MD5

SSL_RSA_WITH_IDEA_CBC_SHAIDEA-CBC-SHA

SSL_RSA_EXPORT_WITH_DES40_CBC_SHAEXP-DES-CBC-SHA

SSL_RSA_WITH_DES_CBC_SHADES-CBC-SHA

SSL_RSA_WITH_3DES_EDE_CBC_SHADES-CBC3-SHA

SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHANotimplemented.

SSL_DH_DSS_WITH_DES_CBC_SHANotimplemented.

SSL_DH_DSS_WITH_3DES_EDE_CBC_SHANotimplemented.

SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHANotimplemented.

SSL_DH_RSA_WITH_DES_CBC_SHANotimplemented.

SSL_DH_RSA_WITH_3DES_EDE_CBC_SHANotimplemented.

SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHAEXP-EDH-DSS-DES-CBC-SHA

SSL_DHE_DSS_WITH_DES_CBC_SHAEDH-DSS-CBC-SHA

SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHAEDH-DSS-DES-CBC3-SHA

SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHAEXP-EDH-RSA-DES-CBC-SHA

SSL_DHE_RSA_WITH_DES_CBC_SHAEDH-RSA-DES-CBC-SHA

SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHAEDH-RSA-DES-CBC3-SHA


SSL_DH_anon_EXPORT_WITH_RC4_40_MD5EXP-ADH-RC4-MD5

SSL_DH_anon_WITH_RC4_128_MD5ADH-RC4-MD5

SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHAEXP-ADH-DES-CBC-SHA

SSL_DH_anon_WITH_DES_CBC_SHAADH-DES-CBC-SHA

SSL_DH_anon_WITH_3DES_EDE_CBC_SHAADH-DES-CBC3-SHA



SSL_FORTEZZA_KEA_WITH_NULL_SHANotimplemented.

SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHANotimplemented.

SSL_FORTEZZA_KEA_WITH_RC4_128_SHANotimplemented.



TLS_RSA_EXPORT1024_WITH_DES_CBC_SHAEXP1024-DES-CBC-SHA

TLS_RSA_EXPORT1024_WITH_RC4_56_SHAEXP1024-RC4-SHA

TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHAEXP1024-DHE-DSS-DES-CBC-SHA

TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHAEXP1024-DHE-DSS-RC4-SHA

TLS_DHE_DSS_WITH_RC4_128_SHADHE-DSS-RC4-SHA





TLSv1.0ciphersuites.

TLS_RSA_WITH_NULL_MD5NULL-MD5

TLS_RSA_WITH_NULL_SHANULL-SHA

TLS_RSA_EXPORT_WITH_RC4_40_MD5EXP-RC4-MD5

TLS_RSA_WITH_RC4_128_MD5RC4-MD5

TLS_RSA_WITH_RC4_128_SHARC4-SHA

TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5EXP-RC2-CBC-MD5

TLS_RSA_WITH_IDEA_CBC_SHAIDEA-CBC-SHA

TLS_RSA_EXPORT_WITH_DES40_CBC_SHAEXP-DES-CBC-SHA

TLS_RSA_WITH_DES_CBC_SHADES-CBC-SHA

TLS_RSA_WITH_3DES_EDE_CBC_SHADES-CBC3-SHA



TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHANotimplemented.

TLS_DH_DSS_WITH_DES_CBC_SHANotimplemented.

TLS_DH_DSS_WITH_3DES_EDE_CBC_SHANotimplemented.

TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHANotimplemented.

TLS_DH_RSA_WITH_DES_CBC_SHANotimplemented.

TLS_DH_RSA_WITH_3DES_EDE_CBC_SHANotimplemented.

TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHAEXP-EDH-DSS-DES-CBC-SHA

TLS_DHE_DSS_WITH_DES_CBC_SHAEDH-DSS-CBC-SHA

TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHAEDH-DSS-DES-CBC3-SHA

TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHAEXP-EDH-RSA-DES-CBC-SHA

TLS_DHE_RSA_WITH_DES_CBC_SHAEDH-RSA-DES-CBC-SHA

TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHAEDH-RSA-DES-CBC3-SHA



TLS_DH_anon_EXPORT_WITH_RC4_40_MD5EXP-ADH-RC4-MD5

TLS_DH_anon_WITH_RC4_128_MD5ADH-RC4-MD5

TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHAEXP-ADH-DES-CBC-SHA

TLS_DH_anon_WITH_DES_CBC_SHAADH-DES-CBC-SHA

TLS_DH_anon_WITH_3DES_EDE_CBC_SHAADH-DES-CBC3-SHA

NOTES
DH算法由于老米没有允许人家使用,所有openssl都没有实现之。
举例时间:
详细列出所有openssl支持的ciphers,包括那些eNULLciphers:
opensslciphers-v‘ALL:eNULL‘
按加密强度列出所有加密算法:
opensslciphers-v‘ALL:!ADH:@STRENGTH‘
详细列出所有同时使用了3DES和RSA的ciphers
opensslciphers-v‘3DES:+RSA‘


openssl简介-指令dgst
用法:

openssldgst[md5|md2|sha1|sha|mdc2|ripemd160][-c][-d][file...]

说明:这个指令可以用来哈希某个文件内容的,[/b:a33ea4edd2]以前的版本还可以用来做数字签名和认证。这个工具本来有很多选项的,可是不知道为什么,现在版本的openssl删掉了很多。表示你用什么算法来哈希该文件内容

OPTIONS
-md5-sha那些就不用结实了吧,都是一些哈希算法的名称
-c
打印出哈希结果的时候用冒号来分隔开。
-d
详细打印出调试信息
file...
你要哈希的文件,如果没有指定,就使用标准输入。
举例时间:
要哈希一个叫fordesign.txt文件的内容,使用SHA算法
openssldgst-sha-cfordesign.txt
SHA(fordesign.txt)=
57:37:dc:a5:8c:bd:12:aa:43:45:fe:2a:19:f5:05:a3:be:e9:08:cc


openssl简介-指令dhparam

用法:

openssldhparam[-informDER|PEM][-outformDER|PEM][-infilename]

[-outfilename][-dsaparam][-noout][-text][-C][-2][-5]

[-randfile(s)][numbits]


描述:
本指令用来维护DH的参数文件。[/b:02e2b109b9]

OPTIONS:
-informDER|PEM
指定输入的格式是DEM还是DER.DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key,.crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
-outformDER|PEM
和上一个差不多,不同的是指定输出格式
-infilename
要分析的文件名称。
-outfilename
要输出的文件名。
-dsaparam
如果本option被set,那么无论输入还是输入都会当做DSA的参数。它们再被转化成DH的参数格式。这样子产生DH参数和DHkey都会块很多。会使SSL握手的时间缩短。当然时间是以安全性做牺牲的,所以如果这样子最好每次使用不同的参数,以免给人K破你的key.
-2,-5
使用哪个版本的DH参数产生器。版本2是缺省的。如果这俩个option有一个被set,那么将忽略输入文件。

-randfile(s)
产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
numbits
指明产生的参数的长度。必须是本指令的最后一个参数。如果没有指明,则产生512bit长的参数。


-noout
不打印参数编码的版本信息。
-text
将DH参数以可读方式打印出来。
-C
将参数转换成C代码方式。这样可以用get_dhnumbits()函数调用这些参数。

openssl还有俩个指令,dh,gendh,现在都过时了,全部功能由dhparam实现。
现在dh,gendh这俩个指令还保留,但在将来可能会用做其他用途。


openssl简介-指令enc

用法:

opensslenc-ciphername[-infilename][-outfilename][-passarg][-e]

[-d][-a][-kpassword][-kfilefilename][-Kkey][-ivIV][-p]

[-P][-bufsizenumber][-debug]


说明:
对称加密算法工具。它能够把数据用不同对称加密算法来加/解密。还能够把加密/接密,还可以把结果进行base64编码。[/b:5c505c4c1d]

OPTIONS
-infilename
要加密/解密的输入文件,缺省为标准输入。
-outfilename
要加密/解密的输出文件,缺省为标准输出。
-passarg
输入文件如果有密码保护,在这里输入密码。
-salt
为了和openssl0.9.5以后的版本兼容,必须set这个option.salt大概又是密码学里的一个术语,具体是做什么的我也没弄的很明白。就我的理解,这是加密过后放在密码最前面的一段字符串,用途也是为了让破解更难.如果理解错了,请密码学高手指正.
-nosalt
想和openssl0.9.5以前的版本兼容,就set这个option
-e
一个缺省会set的option,把输入数据加密。
-d
解密输入数据。
-a
用base64编码处理数据。set了这个option表示在加密之后的数据还要用base64编码捏一次,解密之前则先用base64编码解码。
-kpassword
一个过时了的项,为了和以前版本兼容。现在用-key代替了。
-kfilefilename
同上,被passin代替。
-Kkey
以16进制表示的密码。
-ivIV
作用完全同上。
-p
打印出使用的密码。
-P
作用同上,但打印完之后马上退出。
-bufsizenumber
设置I/O操作的缓冲区大小
-debug
打印调试信息。

注意事项:
0.9.5以后的版本,使用这个指令,-salt是必须被set的。否则很容易用字典攻击法破你的密码,流加密算法也容易被破。(加密算法中有块加密算法和流加密算法俩种,块加密算法是一次加密固定长度的数据,一般是8Bytes,流加密算法则加密大量数据)。为什么我也弄不清楚。研究加密算法实在麻烦,也不是我们程序员的责任本指令可以用不同加密算法,那么哪些好,哪些坏呢?如果你使用不当,高强度的加密算法也变脆弱了。一般推荐新手门使用des3-cbc。

本指令支持的加密算法
base64Base64
bf-cbcBlowfishinCBCmode

bfAliasforbf-cbc

bf-cfbBlowfishinCFBmode

bf-ecbBlowfishinECBmode

bf-ofbBlowfishinOFBmode



cast-cbcCASTinCBCmode

castAliasforcast-cbc

cast5-cbcCAST5inCBCmode

cast5-cfbCAST5inCFBmode

cast5-ecbCAST5inECBmode

cast5-ofbCAST5inOFBmode
des-cbcDESinCBCmode

desAliasfordes-cbc

des-cfbDESinCBCmode

des-ofbDESinOFBmode

des-ecbDESinECBmode


des-ede-cbcTwokeytripleDESEDEinCBCmode

des-edeAliasfordes-ede

des-ede-cfbTwokeytripleDESEDEinCFBmode

des-ede-ofbTwokeytripleDESEDEinOFBmode



des-ede3-cbcThreekeytripleDESEDEinCBCmode

des-ede3Aliasfordes-ede3-cbc

des3Aliasfordes-ede3-cbc

des-ede3-cfbThreekeytripleDESEDECFBmode

des-ede3-ofbThreekeytripleDESEDEinOFBmode

desxDESXalgorithm.

idea-cbcIDEAalgorithminCBCmode

ideasameasidea-cbc

idea-cfbIDEAinCFBmode

idea-ecbIDEAinECBmode

idea-ofbIDEAinOFBmode



rc2-cbc128bitRC2inCBCmode

rc2Aliasforrc2-cbc

rc2-cfb128bitRC2inCBCmode

rc2-ecb128bitRC2inCBCmode

rc2-ofb128bitRC2inCBCmode

rc2-64-cbc64bitRC2inCBCmode

rc2-40-cbc40bitRC2inCBCmode


rc4128bitRC4

rc4-6464bitRC4

rc4-4040bitRC4


rc5-cbcRC5cipherinCBCmode

rc5Aliasforrc5-cbc

rc5-cfbRC5cipherinCBCmode

rc5-ecbRC5cipherinCBCmode

rc5-ofbRC5cipherinCBCmode

大家可能看到DES都分des-ecb,des-cbc,des-cfb这些。简单解释一下。
ecb就是说每来8bytes,就加密8bytes送出去。各个不同的数据块之间没有任何联系。cbc和cfb则每次加密一个8bytes的时候都和上一个8bytes加密的结果有一个运算法则。各个数据块之间是有联系的。
举例时间:
把某二进制文件转换成base64编码方式:
opensslbase64-infile.bin-outfile.b64
把某base64编码文件转换成二进制文件。
opensslbase64-d-infile.b64-outfile.bin
把某文件用DES-CBC方式加密。加密过程中会提示你输入保护密码。

openssldes3-salt-infile.txt-outfile.des3
解密该文件,密码通过-k来输入
openssldes3-d-salt-infile.des3-outfile.txt-kmypassword
加密某文件,并且把加密结果进行base64编码。用bf+cbc算法加密
opensslbf-a-salt-infile.txt-outfile.bf
先用base64解码某文件,再解密
opensslbf-d-salt-a-infile.bf-outfile.txt


openssl简介-指令gendsa

用法:

opensslgendsa[-outfilename][-des][-des3][-idea]

[-randfile(s)][paramfile]



描述:

本指令由DSA参数来产生DSA的一对密钥。dsa参数可以用dsaparam来产生。[/b:3ff9640d43]

OPTIONS
-des|-des3|-idea
采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。
如果这三个中一个也没set,我们的密钥将不被加密而输入。
-randfile(s)
产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
paramfile
指定使用的DSA参数文件。


openssl简介-指令genrsa

用法:

opensslgenrsa[-outfilename][-passoutarg][-des][-des3][-idea]

[-f4][-3][-randfile(s)][numbits]


DESCRIPTION
生成RSA私有密钥的工具。[/b:e2fe605c7d]


OPTIONS
-outfilename
私有密钥输入文件名,缺省为标准输出。
theoutputfilename.Ifthisargumentisnotspecifiedthenstandardoutputisuused.
-passoutarg
参看指令dsa里面的passout参数说明
-des|-des3|-idea
采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。
如果这三个中一个也没set,我们的密钥将不被加密而输入。
-F4|-3
使用的公共组件,一种是3,一种是F4,我也没弄懂这个option是什么意思。
-randfile(s)
产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
numbits
指明产生的参数的长度。必须是本指令的最后一个参数。如果没有指明,则产生512bit长的参数。
研究过RSA算法的人肯定知道,RSA的私有密钥其实就是三个数字,其中俩个是质数。这俩个呢,就叫primenumbers.产生RSA私有密钥的关键就是产生这俩。还有一些其他的参数,引导着整个私有密钥产生的过程。因为产生私有密钥过程需要很多随机数,这个过程的时间是不固定的。
产生primenumbers的算法有个bug,它不能产生短的primes.key的bits起码要有64位。一般我们都用1024bit的key.


openssl简介-指令passwd

SYNOPSIS

opensslpasswd[-crypt][-1][-apr1][-saltstring][-infile][-stdin]

[-quiet][-table]{password}



说明:
本指令计算用来哈希某个密码,也可以用来哈希文件内容。[/b:da40679049]
本指令支持三种哈希算法:
UNIX系统的标准哈希算法(crypt)
MD5-basedBSD(1)

OPTIONS
-crypt-1-apr1
这三个option中任意选择一个作为哈希算法,缺省的是-crypt
-saltstring
输入作为salt的字符串。
-infile
要哈希的文件名称
-stdin
从标准输入读入密码
-quiet
当从标准输入读密码,输入的密码太长的时候,程序将自动解短它。这个option的
set将不在情况下发出警告。
-table
在输出列的时候,先输出明文的密码,然后输出一个TAB,再输出哈希值.
举例时间:
opensslpasswd-crypt-saltxxpasswordxxj31ZMTZzkVA.
opensslpasswd-1-saltxxxxxxxxpassword$1$xxxxxxxx$8XJIcl6ZXqBMCK0qFevqT1.
opensslpasswd-apr1-saltxxxxxxxxpassword$apr1$xxxxxxxx$dxHfLAsjHkDRmG83UXe8K0


openssl简介-指令pkcs7
用法:
opensslpkcs7[-informPEM|DER][-outformPEM|DER][-infilename]

[-outfilename][-print_certs][-text][-noout]


说明:
处理PKCS#7文件的工具,[/b:6d30603c82]

OPTIONS
-informDER|PEM
指定输入的格式是DEM还是DER.DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key,.crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
-outformDER|PEM
和上一个差不多,不同的是指定输出格式
-infilename
要分析的文件名称,缺省是标准输入.
-outfilename
要输出的文件名,缺省是标准输出.
writetoorstandardoutputbydefault.
-print_certs
打印出该文件内的任何证书或者CRL.
-text
打印出证书的细节.
-noout
不要打印出PKCS#7结构的编码版本信息.
举例时间:
把一个PKCS#7文件从PEM格式转换成DER格式
opensslpkcs7-infile.pem-outformDER-outfile.der
打印出文件内所有的证书
opensslpkcs7-infile.pem-print_certs-outcerts.pem
PCKS#7文件的开始和结束俩行是这样子的:
-----BEGINPKCS7-----
-----ENDPKCS7-----
为了和某些猥琐CA兼容,这样子的格式也可以接受
-----BEGINCERTIFICATE-----
-----ENDCERTIFICATE-----
好象我们还没有解释pkcs#7是什么东西.有兴趣的可以看看rfc2315,估计看完目录还没有阵亡的同学不会超过1/10.


openssl简介-指令rand

用法:

opensslrand[-outfile][-randfile(s)][-base64]num


描述:
用来产生伪随机字节.随机数字产生器需要一个seed,先已经说过了,在没有/dev/srandom系统下的解决方法是自己做一个~/.rnd文件.如果该程序能让随机数字产生器很满意的被seeded,程序写回一些怪怪的东西回该文件.[/b:55d4e97ab2]

OPTIONS
-outfile
输出文件.
-randfile(s)
产生随机数字的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
-base64
对产生的东西进行base64编码
num
指明产生多少字节随机数.


openssl简介-指令req

用法:

opensslreq[-informPEM|DER][-outformPEM|DER][-infilename]

[-passinarg][-outfilename][-passoutarg][-text][-noout]

[-verify][-modulus][-new][-randfile(s)][-newkeyrsa:bits]

[-newkeydsa:file][-nodes][-keyfilename][-keyformPEM|DER]

[-keyoutfilename][-[md5|sha1|md2|mdc2]][-configfilename]

[-x509][-daysn][-asn1-kludge][-newhdr][-extensionssection]

[-reqextssection]

描述:
本指令用来创建和处理PKCS#10格式的证书.它还能够建立自签名证书,做RootCA.[/b:866f672f5a]

OPTIONS
-informDER|PEM
指定输入的格式是DEM还是DER.DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key,.crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
-outformDER|PEM
和上一个差不多,不同的是指定输出格式
-infilename
要处理的CSR的文件名称,只有-new和-newkey俩个option没有被set,本option才有效
-passinarg
去看看CA那一章关于这个option的解释吧。
-outfilename
要输出的文件名
-passoutarg
参看dsa指令里的passout这个option的解释吧.
-text
将CSR文件里的内容以可读方式打印出来
-noout
不要打印CSR文件的编码版本信息.
-modulus
将CSR里面的包含的公共米要的系数打印出来.
-verify
检验请求文件里的签名信息.
-new
本option产生一个新的CSR,它会要用户输入创建CSR的一些必须的信息.至于需要哪些信息,是在config文件里面定义好了的.如果-key没有被set,那么就将根据config文件里的信息先产生一对新的RSA密钥
-randfile(s)
产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
-newkeyarg
同时生成新的私有密钥文件和CSR文件.本option是带参数的.如果是产生RSA的私有密钥文件,参数是一个数字,指明私有密钥bit的长度.如果是产生DSA的私有密钥文件,参数是DSA密钥参数文件的文件名.
-keyfilename
参数filename指明我们的私有密钥文件名.允许该文件的格式是PKCS#8.
-keyformDER|PEM
指定输入的私有密钥文件的格式是DEM还是DER.DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key,.crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
-outformDER|PEM
和上一个差不多,不同的是指定输出格式
-keyformPEM|DER
私有密钥文件的格式,缺省是PEM
-keyoutfilename
指明创建的新的私有密钥文件的文件名.如果该option没有被set,将使用config文件里面指定的文件名.
-nodes
本option被set的话,生成的私有密钥文件将不会被加密.
-[md5|sha1|md2|mdc2]
指明签发的证书使用什么哈希算法.如果没有被set,将使用config文件里的相应item的设置.但DSA的CSR将忽略这个option,而采用SHA1哈希算法.
-configfilename
使用的config文件的名称.本option如果没有set,将使用缺省的config文件.
-x509
本option将产生自签名的证书.一般用来错测试用,或者自己玩下做个RootCA.证书的扩展项在config文件里面指定.
-daysn
如果-509被set,那么这个option的参数指定我们自己的CA给人家签证书的有效期.缺省是30天.
-extensionssection-reqextssection
这俩个option指定config文件里面的与证书扩展和证书请求扩展有关的俩个section的名字(如果-x509这个option被set).这样你可以在config文件里弄几个不同的与证书扩展有关的section,然后为了不同的目的给CSR签名的时候指明不同的section来控制签名的行为.
-asn1-kludge
缺省的req指令输出完全符合PKCS10格式的CSR,但有的CA仅仅接受一种非正常格式的CSR,这个option的set就可以输出那种格式的CSR.要解释这俩种格式有点麻烦,需要用到ASN1和PKCS的知识,而且现在这样子怪的CA几乎没有,所以省略解释
-newhdr
在CSR问的第一行和最后一行中加一个单词"NEW",有的软件(netscapecertificateserver)和有的CA就有这样子的怪癖嗜好.如果那些必须要的option的参数没有在命令行给出,那么就会到config文件里去查看是否有缺省值,然后时候。config文件中相关的一些KEY的解释与本指令有关的KEY都在[req]这个section里面.
input_passwordoutput_password
私有密钥文件的密码和把密码输出的文件名.同指令的passin,passout的意义相同.
default_bits
指定产生的私有密钥长度,如果为空,那么就用512.只有-new被set,这个设置才起作用,意义同-newkey相同.
default_keyfile
指定输出私有密钥文件名,如果为空,将输出到标准输入,意义同-keyout相同.
oid_file
oid_section
与oid文件有关的项,oid不清楚是什么东西来的.
RANDFILE
产生随机数字的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
encrypt_key
如果本KEY设置为no,那么如果生成一个私有密钥文件,将不被加密.同命令行的-nodes的意义相同.
default_md
指定签名的时候使用的哈希算法,缺省为MD5.命令行里有同样的功能输入.
string_mask
屏蔽掉某些类型的字符格式.不要乱改这个KEY的值!!有的字符格式netscape不支持,所以乱改这个KEY很危险.
req_extensions
指明证书请求扩展section,然后由那个secion指明扩展的特性.openssl的缺省config文件里,扩展的是X509v3,不扩展的是x509v1.这个KEY的意义和命令行里-reqexts相同.
x509_extensions
同命令行的-extension的意义相同.指明证书扩展的sesion,由那个section指明证书扩展的特性.
prompt
如果这个KEY设置为no,那么在生成证书的时候需要的那些信息将从config文件里读入,而不是从标准输入由用户去输入,同时改变下俩个KEY所指明的section的格式.
attributes
一个过时了的东西,不知道也罢.不过它的意义和下一个KEY有点类似,
格式则完全相同.

distinguished_name
指定一个section,由那个section指定在生成证书或者CRS的时候需要的资料.该section的格式如下:
其格式有俩种,如果KEYprompt被set成no(看看prompt的解释),那么这个secion的格式看起来就是这样子的:
CN=MyName
OU=MyOrganization
[email protected]
就说只包括了字段和值。这样子可以可以让其他外部程序生成一个摸板文件,包含所有字段和值,把这些值提出来.等下举例时间会有详细说明.如果prompt没有被set成no,那么这个section的格式则如下:
fieldName="pleaseinputurname"

fieldName_default="fordesign"

fieldName_min=3

fieldName_max=18

"fieldname"就是字段名,比如commonName(或者CN).fieldName(本例中是"prompt")是用来提示用户输入相关的资料的.如果用户什么都不输,那么就使用确省值.如果没有缺省值,那么该字段被忽略.用户如果输入‘.‘,也可以让该字段被忽略.
用户输入的字节数必须在fieldName_min和fieldName_max之间.不同的section还可能对输入的字符有特殊规定,比如必须是可打印字符.那么在本例里面,程序的表现将如下:
首先把fieldName打印出来给用户以提示
pleaseinputurname:
之后如果用户必须输入3到18之间的一个长度的字符串,如果用户什么也不输入,那么就把fieldName_default里面的值"fordesign"作为该字段的值添入.
有的字段可以被重复使用.这就产生了一个问题,config文件是不允许同样的section文件里面有多于一个的相同的key的.其实这很容易解决,比如把它们的名字分别叫做"1.organizationName","2.organizationName"
openssl在编译的时候封装了最必须的几个字段,比如commonName,countryName,localityName,organizationName,organizationUnitName,stateOrPrivinceName还增加了emailAddresssurname,givenNameinitials和dnQualifier.
举例时间:
就使用确省值.如果没有缺省值,那么该字段被忽略.用户如果输入‘.‘,也可以让该字段被忽略.用户输入的字节数必须在fieldName_min和fieldName_max之间.不同的section还可能对输入的字符有特殊规定,比如必须是可打印字符.那么在本例里面,程序的表现将如下:
首先把fieldName打印出来给用户以提示
pleaseinputurname:
之后如果用户必须输入3到18之间的一个长度的字符串,如果用户什么也不输入,那么就把fieldName_default里面的值"fordesign"作为该字段的值添入.
有的字段可以被重复使用.这就产生了一个问题,config文件是不允许同样的section文件里面有多于一个的相同的key的.其实这很容易解决,比如把它们的名字分别叫做"1.organizationName","2.organizationName"openssl在编译的时候封装了最必须的几个字段,比如commonName,countryName,localityName,organizationName,organizationUnitName,stateOrPrivinceName还增加了emailAddresssurname,givenNameinitials和dnQualifier.
举例时间:
Examineandverifycertificaterequest:
检查和验证CSR文件.
opensslreq-inreq.pem-text-verify-noout
做自己的私有密钥文件,然后用这个文件生成CSR文件.
opensslgenrsa-outkey.pem1024
opensslreq-new-keykey.pem-outreq.pem
也可以一步就搞定:
opensslreq-newkeyrsa:1024-keyoutkey.pem-outreq.pem
做一个自签名的给RootCA用的证书:
opensslreq-x509-newkeyrsa:1024-keyoutkey.pem-outcrt.pem
下面是与本指令有关的config文件中相关的部分的一个例子:
[req]
default_bits=1024
default_keyfile=privkey.pem
distinguished_name=req_distinguished_name
attributes=req_attributes
x509_extensions=v3_ca
dirstring_type=nobmp
[req_distinguished_name]
countryName=CountryName(2lettercode)
countryName_default=AU
countryName_min=2
countryName_max=2
localityName=LocalityName(eg,city)
organizationalUnitName=OrganizationalUnitName(eg,section)
commonName=CommonName(eg,YOURname)
commonName_max=64
emailAddress=EmailAddress
emailAddress_max=40
[req_attributes]
challengePassword=Achallengepassword
challengePassword_min=4
challengePassword_max=20
[v3_ca]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints=CA:true
RANDFILE=$ENV::HOME/.rnd
[req]
default_bits=1024
default_keyfile=keyfile.pem
distinguished_name=req_distinguished_name
attributes=req_attributes
prompt=no
output_password=mypass
[req_distinguished_name]
C=GB
ST=TestStateorProvince
L=TestLocality
O=OrganizationName
OU=OrganizationalUnitName
CN=CommonName
[email protected]
[req_attributes]
challengePassword=Achallengepassword
一般的PEM格式的CSR文件的开头和结尾一行如下
-----BEGINCERTIFICATEREQUEST----
-----ENDCERTIFICATEREQUEST----
但个把变态软件和CA硬是需要CSR的文件要这样子:
-----BEGINNEWCERTIFICATEREQUEST----
-----ENDNEWCERTIFICATEREQUEST----
用-newhdr就可以啦,或者你自己手工加也中.openssl对俩种格式都承认.
openssl的config文件也可以用环境变量OPENSSL_CONF或者SSLEAY_CONF来指定.


openssl简介-指令rsa
用法

opensslrsa[-informPEM|NET|DER][-outformPEM|NET|DER][-infilename]

[-passinarg][-outfilename][-passoutarg][-sgckey][-des][-des3]

[-idea][-text][-noout][-modulus][-check][-pubin][-pubout]


说明:
rsa指令专门处理RSA密钥.其实其用法和dsa的差不多.[/b:ac3cf3a933]

OPTIONS
-informDER|PEM|NET
指定输入的格式是DEM还是DER还是NET.注意,这里多了一种格式,就是NET,DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key,.crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。NET格式在本章后面会详细解释.
-outformDER|PEM|NET
和上一个差不多,不同的是指定输出格式
-infilename
要分析的文件名称。如果文件有密码保护,会要你输入的.
-passinarg
去看看CA那一章关于这个option的解释吧。
-outfilename
要输出的文件名。
-passoutarg
没什么用的一个选项,用来把保护key文件的密码输出的,意义和passin差不多。
-sgckey
配合NET格式的私有密钥文件的一个option,没有必要去深入知道了。
-des|-des3|-idea
指明用什么加密算法把我们的私有密钥加密。加密的时候会需要我们输入密码来保护该文件的。如果这仨一个都没有选,那么你的私有密钥就以明文写进你的key文件。该选项只能输出PEM格式的文件。
-text
打印出私有密钥的各个组成部分.
-noout
不打印出key的编码版本信息。
-modulus
把其公共密钥的值也打印出来
-pubin
缺省的来说是从输入文件里读到私有密钥,这个就可以从输入文件里去读公共密钥.
-pubout
缺省的来说是打印出私有密钥,这个就可以打印公共密钥.如果上面那个选项有set那么这个选项也自动被set.
-check
检查RSA的私有密钥是否被破坏了这个指令实在和dsa太相似了。copy的我手软。
现在解释一下NET是一种什么格式。它是为了和老的netscapeserver以及IIS兼容才弄出来的。他使用没有被salt过的RC4做加密算法,加密强度很底,如果不是一定要用就别用。
举例时间:
把RSA私有密钥文件的保护密码去掉(最好别这么做)
opensslrsa-inkey.pem-outkeyout.pem
用DES3算法加密我们的私有密码文件:
opensslrsa-inkey.pem-des3-outkeyout.pem
把一个私有密钥文件从PEM格式转化成DER格式:
opensslrsa-inkey.pem-outformDER-outkeyout.der
把私有密钥的所有内容详细的打印出来:
opensslrsa-inkey.pem-text-noout
只打印出公共密钥部分:
opensslrsa-inkey.pem-pubout-outpubkey.pem


openssl简介-指令rsautl
用法:

opensslrsautl[-infile][-outfile][-inkeyfile][-pubin][-certin]

[-sign][-verify][-encrypt][-decrypt][-pkcs][-ssl][-raw][-hexdump]

[-asn1parse]


描述:
本指令能够使用RSA算法签名,验证身份,加密/解密数据。[/b:86b8dd1e33]

OPTIONS
-infilename
指定输入文件名。缺省为标准输入。
-outfilename
指定输入文件名,缺省为标准输出。
-inkeyfile
指定我们的私有密钥文件,格式必须是RSA私有密钥文件。
-pubin
指定我们的公共密钥文件。说真的我还真不知道RSA的公共密钥文件有什么用,一般公共密钥都是放在证书里面的。
-certin
指定我们的证书文件了。
-sign
给输入的数据签名。需要我们的私有密钥文件。
-verify
对输入的数据进行验证。
-encrypt
用我们的公共密钥对输入的数据进行加密。
-decrypt
用RSA的私有密钥对输入的数据进行解密。
-pkcs,-oaep,-ssl,-raw
采用的填充模式,上述四个值分别代表:PKCS#1.5(缺省值),PKCS#1OAEP,SSLv2里面特定的填充模式,或者不填充。如果要签名,只有-pkcs和-raw可以使用.
-hexdump
用十六进制输出数据。
-asn1parse
对输出的数据进行ASN1分析。看看指令asn1parse吧。该指令一般和-verify一起用的时候威力大。
本指令加密数据的时候只能加密少量数据,要加密大量数据,估计要调API.我也没试过写RSA加密解密的程序来玩。
举例时间:
用私有密钥对某文件签名:
opensslrsautl-sign-infile-inkeykey.pem-outsig
注意哦,文件真的不能太大,这个不能太大意思是必须很小。
文件大小最好不要大过73。绝对不能多过150,多了就会出错。
这个工具真是用来玩的

对签名过的数据进行验证,得到原来的数据。
opensslrsautl-verify-insig-inkeykey.pem
检查原始的签名过的数据:
opensslrsautl-verify-insig-inkeykey.pem-raw-hexdump

0000-0001ffffffffffff-ffffffffffffffff................

0010-ffffffffffffffff-ffffffffffffffff................

0020-ffffffffffffffff-ffffffffffffffff................

0030-ffffffffffffffff-ffffffffffffffff................

0040-ffffffffffffffff-ffffffffffffffff................

0050-ffffffffffffffff-ffffffffffffffff................

0060-ffffffffffffffff-ffffffffffffffff................

0070-ffffffff0068656c-6c6f20776f726c64.....helloworld
很明显,这是PKCS#1结构:使用0xff填充模式。
配合指令asn1parse,可以分析签名的证书,我们在req指令里说了怎么做自签名的证书了,现在来分析一下先。
opensslasn1parse-inpca-cert.pem

0:d=0hl=4l=742cons:SEQUENCE

4:d=1hl=4l=591cons:SEQUENCE

8:d=2hl=2l=3cons:cont[0]

10:d=3hl=2l=1prim:INTEGER:02

13:d=2hl=2l=1prim:INTEGER:00

16:d=2hl=2l=13cons:SEQUENCE

18:d=3hl=2l=9prim:OBJECT:md5WithRSAEncryption

29:d=3hl=2l=0prim:NULL

31:d=2hl=2l=92cons:SEQUENCE

33:d=3hl=2l=11cons:SET

35:d=4hl=2l=9cons:SEQUENCE

37:d=5hl=2l=3prim:OBJECT:countryName

42:d=5hl=2l=2prim:PRINTABLESTRING:AU

....

599:d=1hl=2l=13cons:SEQUENCE

601:d=2hl=2l=9prim:OBJECT:md5WithRSAEncryption

612:d=2hl=2l=0prim:NULL

614:d=1hl=3l=129prim:BITSTRING

最后一行BITSTRING就是实际的签名。我们可以这样子捏它出来:
opensslasn1parse-inpca-cert.pem-outsig-noout-strparse614
还可以这样子把公共密钥给弄出来:
opensslx509-intest/testx509.pem-pubkey-noout>pubkey.pem
我们也可以这样子分析签名:
opensslrsautl-insig-verify-asn1parse-inkeypubkey.pem-pubin
0:d=0hl=2l=32cons:SEQUENCE

2:d=1hl=2l=12cons:SEQUENCE

4:d=2hl=2l=8prim:OBJECT:md5

14:d=2hl=2l=0prim:NULL

16:d=1hl=2l=16prim:OCTETSTRING

0000-f3469eaa1a4a73c9-37ea9300482508b5.F...Js.7...H%..

这是经过分析后的ASN1结构。可以看出来使用的哈希算法是md5.(很抱歉,我自己试这一行的时候输出结果却完全不同。
0:d=0hl=2l=120cons:appl[24]
lengthisgreaterthan18
完全没有办法看出那里有写哈希算法。)
证书里面的签名部分可以这么捏出来:
opensslasn1parse-inpca-cert.pem-outtbs-noout-strparse4
这样得到他的哈希算法的细节:
opensslmd5-ctbs
MD5(tbs)=f3:46:9e:aa:1a:4a:73:c9:37:ea:93:00:48:25:08:b5


openssl简介-指令s_client

用法:

openssls_client[-connecthost:port>][-verifydepth][-certfilename]

[-keyfilename][-CApathdirectory][-CAfilefilename][-reconnect]

[-pause][-showcerts][-debug][-nbio_test][-state][-nbio][-crlf]

[-ign_eof][-quiet][-ssl2][-ssl3][-tls1][-no_ssl2][-no_ssl3]

[-no_tls1][-bugs][-ciphercipherlist]

描述:
用于模拟一个普通的SSL/TLSclient,对于调试和诊断SSLserver很有用。[/b:255918d001]

OPTIONS
-connecthost:port
这个不用解释了吧,连接的ip:port.
-certcertname
使用的证书文件。如果server不要求要证书,这个可以省略。
-keykeyfile
使用的私有密钥文件
-verifydepth
指定验证深度。记得CA也是分层次的吧?如果对方的证书的签名CA不是RootCA,那么你可以再去验证给该CA的证书签名的CA,一直到RootCA.目前的验证操作即使这条CA链上的某一个证书验证有问题也不会影响对更深层的CA的身份的验证。所以整个CA链上的问题都可以检查出来。当然CA的验证出问题并不会直接造成连接马上断开,好的应用程序可以让你根据验证结果决定下一步怎么走。
-CApathdirectory
一个目录。里面全是CA的验证资料,该目录必须是"哈希结构".verify指令里会详细说明。在建立client的证书链的时候也有用到这个指令。
-CAfilefile
某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。
-reconnect
使用同样的session-id连接同一个server五次,用来测试server的session缓冲功能是否有问题。
-pause
每次读写操作后都挺顿一秒。
-showcerts
显示整条server的证书的CA的证书链。否则只显示server的证书。
-prexit
当程序退出的时候打印session的信息。即使连接失败,也会打印出调试信息。一般如果连接成功的话,调试信息将只被打出来一次。本option比较有用,因为在一次SSL连接中,cipher也可能改变,或者连接可能失败。要注意的是:有时候打印出来的东西并不一定准确。(这样也行??eric,言重了.)
-state
打印SSLsession的状态,ssl也是一个协议,当然有状态。
-debug
打印所有的调试信息。
-nbio_test
检查非阻塞socket的I/O运行情况。
-nbio
使用非阻塞socket
-crlf
回把你在终端输入的换行回车转化成/r/n送出去。
-ign_eof
当输入文件到达文件尾的时候并不断开连接。
-quiet
不打印出session和证书的信息。同时会打开-ign_eof这个option.
-ssl2,-ssl3,-tls1,-no_ssl2,-no_ssl3,-no_tls1
选择用什么版本的协议。很容易理解,不用多解释了吧。
注意,有些很古老的server就是不能处理TLS1,所以这个时候要关掉TLS1.n.
-bugs
SSL/TLS有几处众所周知的bug,set了这个option使出错的可能性缩小。
-ciphercipherlist
由我们自己来决定选用什么cipher,尽管是由server来决定使用什么cipher,但它一般都会采用我们送过去的cipher列表里的第一个cipher.
有哪些cipher可用?指令cipher对这个解释的更清楚。
一旦和某个SSLserver建立连接之后,所有从server得到的数据都会被打印出来,所有你在终端上输入的东西也会被送给server.这是人机交互式的。这时候不能set-quiet和-ign_eof这俩个option。如果输入的某行开头字母是R,那么在这里session会renegociate,如果输入的某行开头是Q,那么连接会被断开。你完成整个输入之后连接也会被断开。
IfaconnectionisestablishedwithanSSLserverthenanydatareceivedfromtheserverisdisplayedandanykeypresseswillbesenttotheserver.Whenusedinteractively(whichmeansneither-quietnor-ign_eofhavebeengiven),thesessionwillberenegociatedifthelinebeginswithanR,andifthelinebeginswithaQorifendoffileisreached,theconnectionwillbecloseddown.
本指令主要是来debug一个SSLserver的。如果想连接某个SSLHTTPserver,输入下一条指令:
openssls_client-connectservername:443
如果连接成功,你可以用HTTP的指令,比如"GET/"什么的去获得网页了。
如果握手失败,原因可能有以下几种:
1.server需要验证你的证书,但你没有证书
2.如果肯定不是原因1,那么就慢慢一个一个set以下几个option
-bugs,-ssl2,-ssl3,-tls1,-no_ssl2,-no_ssl3,-no_tls1
这可能是因为对方的server处理SSL有bug.
有的时候,client会报错:没有证书可以使用,或者供选择的证书列表是空的。这一般是因为Server没有把给你签名的CA的名字列进它自己认为可以信任的CA列表,你可以用检查一下server的信任CA列表。有的httpserver只在client给出了一个URL之后才验证client的证书,这中情况下要set-prexit这个option,并且送给server一个页面请求。
即使使用-cert指明使用的证书,如果server不要求验证client的证书,那么该证书也不会被验证。所以不要以为在命令行里加了-cert的参数又连接成功就代表你的证书没有问题。
如果验证server的证书没有问题,就可以set-showcerts来看看server的证书的CA链了。
其实这个工具并不好用,自己写一个client的会方便很多。
举例时间:
注意,中间的pop3协议的指令是我通过终端输入的。其他都是程序输出的对话
过程。具体的每行意义不用解释了。


openssls_client-keyserver.key-verify1-showcerts-prexit-state/
-crlf-connect127.0.0.1:5995
verifydepthis1
CONNECTED(00000003)
SSL_connect:before/connectinitialization
SSL_connect:SSLv2/v3writeclienthelloA
SSL_connect:SSLv3readserverhelloA
depth=0/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/
[email protected]
verifyerror:num=20:unabletogetlocalissuercertificate
verifyreturn:1
depth=0/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/
[email protected]
verifyerror:num=27:certificatenottrusted
verifyreturn:1
depth=0/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/
[email protected]
verifyerror:num=21:unabletoverifythefirstcertificate
verifyreturn:1
SSL_connect:SSLv3readservercertificateA
SSL_connect:SSLv3readserverdoneA
SSL_connect:SSLv3writeclientkeyexchangeA
SSL_connect:SSLv3writechangecipherspecA
SSL_connect:SSLv3writefinishedA
SSL_connect:SSLv3flushdata
SSL_connect:SSLv3readfinishedA
Certificatechain
0s:/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/[email protected]
i:/C=AU/ST=Some-State/O=InternetWidgitsPtyLtd/CN=fordesign/
[email protected]
----BEGINCERTIFICATE-----
MIIDdzCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQQFADB8MQswCQYDVQQGEwJBVTET
MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ
dHkgTHRkMRIwEAYDVQQDEwlmb3JkZXNpZ24xITAfBgkqhkiG9w0BCQEWEmZvcmRl
aXNnbkAyMWNuLmNvbTAeFw0wMDExMTIwNjE5MDNaFw0wMTExMTIwNjE5MDNaMH0x
CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMQswCQYDVQQHEwJnejEP
MA0GA1UEChMGYWkgbHRkMQswCQYDVQQLEwJzdzESMBAGA1UEAxMJZm9yZGVzaWdu
MRowGAYJKoZIhvcNAQkBFgt4eHhAeHh4LnhvbTCBnzANBgkqhkiG9w0BAQEFAAOB
jQAwgYkCgYEAuQVRVaCyF+a8/927cA9CjlrSEGOL17+Fk1U6rqZ8fJ6UR+kvhUUk
fgyMmzrw4bhnZlk2NV5afZEhiiNdRri9f8loklGRXRkDfmhyUWtjiFWUDtzkuQoT
6jhWfoqGNCKh/92cjq2wicJpp40wZGlfwTwSnmjN9/eNVwEoXigSy5ECAwEAAaOC
AQYwggECMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh
dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBS+WovE66PrvCAtojYMV5pEUYZtjzCB
pwYDVR0jBIGfMIGcgBRpQYdVvVKZ0PXsEX8KAVNYTgt896GBgKR+MHwxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWZvcmRlc2lnbjEhMB8GCSqGSIb3DQEJ
ARYSZm9yZGVpc2duQDIxY24uY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBADDOp/O/
o3mBZV4vc3mm2C6CcnB7rRSYEoGm6T6OZsi8mxyF5w1NOK5oI5fJU8xcf8aYFVoi
0i4LlsiQw+EwpnjUXfUBxp/g4Cazlv57mSS6h1t4a/BPOIwzcZGpo/R3g/fOPwsF
F/2RC++81s6k78iezFrTs9vnsm/G4vRjngLI
-----ENDCERTIFICATE-----
---
Servercertificate
subject=/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/
[email protected]
issuer=/C=AU/ST=Some-State/O=InternetWidgitsPtyLtd/CN=fordesign/
[email protected]
---
NoclientcertificateCAnamessent
---
SSLhandshakehasread1069bytesandwritten342bytes
---
New,TLSv1/SSLv3,CipherisDES-CBC3-SHA
Serverpublickeyis1024bit
SSL-Session:
Protocol:SSLv3
Cipher:DES-CBC3-SHA
Session-ID:E1EC3B051F5DB8E2E3D3CD10E4C0412501DDD6641ACA932B65
DC25DCD0A3A86E
Session-ID-ctx:
Master-Key:47DB3A86375DB2E99982AFD8F5B382B4316385694B01B74BFC3
FA26C7DBD489CABE0EE1B20CE8E95E4ABF930099084B0
Key-Arg:None
StartTime:974010506
Timeout:300(sec)
Verifyreturncode:0(ok)
---
+OKAIMCPOPservice(sol7.gzai.com)isready.
userssltest0
+OKPleaseenterpasswordforuser<ssltest0>.
passssltest0
+OKssltest0has12message(282948octets)
list
+OK12messages(282948octets)
121230
221230
321230
421230
521229
621230
721230
821230
9111511
10136
11141
121321
.
quit
+OKPopserverat(sol7.gzai.com)signingoff.
read:errno=0
SSL3alertwrite:warning:closenotify
---
Certificatechain
0s:/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/
[email protected]
i:/C=AU/ST=Some-State/O=InternetWidgitsPtyLtd/CN=fordesign/
[email protected]
-----BEGINCERTIFICATE-----
MIIDdzCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQQFADB8MQswCQYDVQQGEwJBVTET
MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ
dHkgTHRkMRIwEAYDVQQDEwlmb3JkZXNpZ24xITAfBgkqhkiG9w0BCQEWEmZvcmRl
aXNnbkAyMWNuLmNvbTAeFw0wMDExMTIwNjE5MDNaFw0wMTExMTIwNjE5MDNaMH0x
CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMQswCQYDVQQHEwJnejEP
MA0GA1UEChMGYWkgbHRkMQswCQYDVQQLEwJzdzESMBAGA1UEAxMJZm9yZGVzaWdu
MRowGAYJKoZIhvcNAQkBFgt4eHhAeHh4LnhvbTCBnzANBgkqhkiG9w0BAQEFAAOB
jQAwgYkCgYEAuQVRVaCyF+a8/927cA9CjlrSEGOL17+Fk1U6rqZ8fJ6UR+kvhUUk
fgyMmzrw4bhnZlk2NV5afZEhiiNdRri9f8loklGRXRkDfmhyUWtjiFWUDtzkuQoT
6jhWfoqGNCKh/92cjq2wicJpp40wZGlfwTwSnmjN9/eNVwEoXigSy5ECAwEAAaOC
AQYwggECMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh
dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBS+WovE66PrvCAtojYMV5pEUYZtjzCB
pwYDVR0jBIGfMIGcgBRpQYdVvVKZ0PXsEX8KAVNYTgt896GBgKR+MHwxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWZvcmRlc2lnbjEhMB8GCSqGSIb3DQEJ
ARYSZm9yZGVpc2duQDIxY24uY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBADDOp/O/
o3mBZV4vc3mm2C6CcnB7rRSYEoGm6T6OZsi8mxyF5w1NOK5oI5fJU8xcf8aYFVoi
0i4LlsiQw+EwpnjUXfUBxp/g4Cazlv57mSS6h1t4a/BPOIwzcZGpo/R3g/fOPwsF
F/2RC++81s6k78iezFrTs9vnsm/G4vRjngLI
-----ENDCERTIFICATE-----
---
Servercertificate
subject=/C=AU/ST=Some-State/L=gz/O=ailtd/OU=sw/CN=fordesign/
[email protected]
issuer=/C=AU/ST=Some-State/O=InternetWidgitsPtyLtd/CN=fordesign/
[email protected]
---
NoclientcertificateCAnamessent
---
SSLhandshakehasread1579bytesandwritten535bytes
---
New,TLSv1/SSLv3,CipherisDES-CBC3-SHA
Serverpublickeyis1024bit
SSL-Session:
Protocol:SSLv3
Cipher:DES-CBC3-SHA
Session-ID:E1EC3B051F5DB8E2E3D3CD10E4C0412501DDD6641ACA932B65DC2
5DCD0A3A86E
Session-ID-ctx:
Master-Key:47DB3A86375DB2E99982AFD8F5B382B4316385694B01B74BFC3FA
26C7DBD489CABE0EE1B20CE8E95E4ABF930099084B0
Key-Arg:None
StartTime:974010506
Timeout:300(sec)
Verifyreturncode:0(ok)


openssl简介-指令s_server
用法:

openssls_server[-acceptport][-contextid][-verifydepth]

[-Verifydepth][-certfilename][-keykeyfile][-dcertfilename]

[-dkeykeyfile][-dhparamfilename][-nbio][-nbio_test][-crlf]

[-debug][-state][-CApathdirectory][-CAfilefilename][-nocert]

[-ciphercipherlist][-quiet][-no_tmp_rsa][-ssl2][-ssl3][-tls1]

[-no_ssl2][-no_ssl3][-no_tls1][-no_dhe][-bugs][-hack][-www]

[-WWW][-engineid]



说明:
和s_client是反义词,模拟一个实现了SSL的server.[/b:9bb4dda710]


OPTIONS
-acceptport
监听的TCP端口。缺省为4433.
-contextid
设置SSLcontext的id,可以设置为任何值。SSLcontext是什么?编程的章节会详细介绍的。你也可以不set这个option,有缺省的给你用的。
-certcertname
使用的证书文件名。缺省使用./server.pem
-keykeyfile
使用的私有密钥文件。如果没有指定,那么证书文件会被使用。????
Theprivatekeytouse.Ifnotspecifiedthenthecertificate
filewillbeused.
-dcertfilename,-dkeykeyname
指定一个附加的证书文件和私有密钥文件。不同的cipher需要不同的证书和私有密钥文件。这个不同的cipher主要指cipher里面的不对称加密算法不同比如基于RSA的cipher需要的是RSA的私有密钥文件和证书,而基于DSA的算法则需要的是DSA的私有密钥文件和证书.这个option可以让这样我们的server同时支持俩种算法的cipher成为可能。
-nocert
如果server不想使用任何证书,set这个option.
目前只有anonymousDH算法有需要这么做。
-dhparamfilename
使用的DH参数文件名。如果没有set,那么server会试图去从证书文件里面获得这些参数。如果证书里面没有这么参数,一些hardcode的参数就被调用。
-nodhe
禁止使用基于EDH的cipher.
-no_tmp_rsa
现在的出口cipher有时会使用临时RSA密钥。那就是说每次对话的时候临时生成密钥对。本optio就是用来禁止这种情况的。
-verifydepth,-Verifydepth
意义和s_client的这个option一样,但同时表示必须验证client的证书。不记得server对client的证书验证是可以选的吗?-verify表示向client要求证书,但client还是可以选择不发送证书,-Verify表示一定要client的证书验证,否则握手告吹。
-CApathdirectory
-CAfilefile
-state
-debug
-nbio_test
-nbio
-crlf
-quiet
-ssl2,-ssl3,-tls1,-no_ssl2,-no_ssl3,-no_tls1
-bugs
-ciphercipherlist
这些option于s_client的同名option意义相同。
下面俩个指令模拟一个简单的httpserver.
-www
当client连接上来的时候,发回一个网页,内容就是SSL握手的一些内容。
-WWW
用来把具体某个文件当网页发回给client的请求。比如client的URL请求是https://myhost/page.html,就把./page.html发回给client.如果没有set-www,-WWW这俩个option,当一个sslclient连接上来的话它所发过来的任何东西都会显示出来,你在终端输入的任何东西都会发回给client.你可以通过在终端输入的行的第一个字母控制一些行为
q:
中断当前连接,但不关闭server.
Q
中断当前连接,退出程序。
r
进行renegotiate行为。
R
进行renegotiate行为,并且要求client的证书。
P
在TCP层直接送一些明文。这会使client认为我们没有按协议的游戏规则进行通信而断开连接。
S
打印出session-cache的状态信息。session-cache在编程章节会详细介绍。
NOTES
用于调试sslclient.
下一条指令用来模拟一个小的httpserver,监听443端口。
openssls_server-accept443-www
session的参数可以用sess_id指令打印。
我对这条指令实在没有兴趣,一般使用openssl都是用做server,没有机会调试client.我甚至没有用过这个指令。


openssl简介-指令sess_id

用法:

opensslsess_id[-informPEM|DER][-outformPEM|DER][-infilename]

[-outfilename][-text][-noout][-contextID]


说明:
本指令是处理SSL_SESSION结构的,可以打印出其中的细节。这也是一个调试工具。[/b:bd4a94ad46]
-informDER|PEM
指定输入格式是DER还是PEM.
-outformDER|PEM
指定输出格式是DER还是PEM
-infilename
指定输入的含有session信息的文件名,可以通过标准输入得到。
-outfilename
指定输出session信息的文件名
-text
打印出明文的密钥的各个部件。
-cert
set本option将会把session中使用的证书打印出来。如果-text也被set,那么将会把其用文本格式打印出来。
-noout
不打印出session的编码版本。
-contextID
设置sessionid.不常用的一个option.
本指令的典型的输出是:
SSL-Session:
Protocol:TLSv1
Cipher:0016
Session-ID:871E62626C554CE95488823752CBD5F3673A3EF3DCE9
C67BD916C809914B40ED
Session-ID-ctx:01000000
Master-Key:A7CEFC571974BE02CAC305269DC59F76EA9F0B180CB66
42697A68251F2D2BB57E51DBBB4C7885573192AE9AEE220FACD
Key-Arg:None
StartTime:948459261
Timeout:300(sec)
Verifyreturncode0(ok)
Protocol
使用的协议版本信息。
Cipher
使用的cipher,这里是原始的SSL/TLS里定义的代码。
Session-ID
16进制的sessionid
Session-ID-ctx
session-id-ctx的16进制格式。
Master-Key
sslsessionmasterkey.
Key-Arg
key的参数,只用于SSLv2
StartTime
session开始的时间。标准的unix格式。
Timeout
session-timeout时间。
Verifyreturncode
证书验证返回值.
sslsession文件的pem标准格式的第一行和最后一行是:
---BEGINSSLSESSIONPARAMETERS-----
-----ENDSSLSESSIONPARAMETERS-----
因为sslsession输出包含握手的重要信息:masterkey,所以一定要用一定的加密算法把起输出加密。一般是禁止在实际应用中把session的信息输出。我没用过这个工具。研究source的时候这个可能有点用。


openssl简介-指令speed
用法:

opensslspeed[-elapsed][md2][mdc2][md5][hmac][sha1][rmd160]

[idea-cbc][rc2-cbc][rc5-cbc][bf-cbc][des-cbc][des-ede3]

[rc4][rsa512][rsa1024][rsa2048][rsa4096][dsa512]

[dsa1024][dsa2048][idea][rc2][des][rsa][blowfish]

说明:
算法在你的机器上的测试工具。[/b:739ad57266]

OPTIONS
-elapsed
set了这个option将使测试结果是我们比较容易懂的时间格式,否则将是和time指令那样子显示的cpu时间。
其他的option都是算法了。


openssl简介-指令version
用法:

opensslversion[-a][-v][-b][-o][-f][-p]


说明:
用来打印版本信息的。最没用的指令和最简单的指令。[/b:e6b49627ab]

OPTIONS
-a
打印所有信息,相当于把其他option全set起来。
当你向openssl官方站点报bug的时候,需要把这个指令列出来的东西也告诉他们
-v
打印当前openssl的版本信息。
-b
打印当前版本的openssl是什么时候弄出来的
-o
建立库的时候的各种于加密算法和机器字节有关的信息。
-c
编译时候的编译其的参数
-p
平台信息


openssl简介-指令x509

用法:

opensslx509[-informDER|PEM|NET][-outformDER|PEM|NET]

[-keyformDER|PEM][-CAformDER|PEM][-CAkeyformDER|PEM]

[-infilename][-outfilename][-serial][-hash][-subject]

[-issuer][-nameoptoption][-email][-startdate][-enddate]

[-purpose][-dates][-modulus][-fingerprint][-alias]

[-noout][-trustout][-clrtrust][-clrreject][-addtrustarg]

[-addrejectarg][-setaliasarg][-daysarg]

[-signkeyfilename][-x509toreq][-req][-CAfilename]

[-CAkeyfilename][-CAcreateserial][-CAserialfilename]

[-text][-C][-md2|-md5|-sha1|-mdc2][-clrext]

[-extfilefilename][-extensionssection]


说明:
本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等等。由于功能太多,我们按功能分成几部分来讲。[/b:92d418ddf0]
输入,输出等一些一般性的option
-informDER|PEM|NET
指定输入文件的格式。
-outformDER|PEM|NET
指定输出文件格式
-infilename
指定输入文件名
-outfilename
指定输出文件名
-md2|-md5|-sha1|-mdc2
指定使用的哈希算法。缺省的是MD5于打印有关的option
-text
用文本方式详细打印出该证书的所有细节。
-noout
不打印出请求的编码版本信息。
-modulus
打印出公共密钥的系数值。没研究过RSA就别用这个了。
-serial
打印出证书的系列号。
-hash
把证书的拥有者名称的哈希值给打印出来。
-subject
打印出证书拥有者的名字。
-issuer
打印证书颁发者名字。
-nameoptoption
指定用什么格式打印上俩个option的输出。
后面有详细的介绍。
-email
如果有,打印出证书申请者的email地址
-startdate
打印证书的起始有效时间
-enddate
打印证书的到期时间
-dates
把上俩个option都给打印出来
-fingerprint
打印DER格式的证书的DER版本信息。
-C
用C代码风格打印结果。
与证书信任有关的option
一个可以信任的证书的就是一个普通证书,但有一些附加项指定其可以用于哪些用途和不可以用于哪些用途,该证书还应该有一个"别名"。
一般来说验证一个证书的合法性的时候,相关的证书链上至少有一个证书必须是一个可以信任的证书。缺省的认为如果该证书链上的RootCA的证书可以信任,那么整条链上其他证书都可以用于任何用途。
以下的几个option只用来验证RootCA的证书。CA在颁发证书的时候可以控制该证书的用途,比如颁发可以用于SSLclient而不能用于SSLserver的证书。
-trustout
打印出可以信任的证书。
-setaliasarg
设置证书别名。比如你可以把一个证书叫"fordesign‘scertificate",那么以后就可以使用这个别名来引用这个证书。
-alias
打印证书别名。
-clrtrust
清除证书附加项里所有有关用途允许的内容。
-clrreject
清除证书附加项里所有有关用途禁止的内容。
-addtrustarg
添加证书附加项里所有有关用途允许的内容。
-addrejectarg
添加证书附加项里所有有关用途禁止的内容。
-purpose
打印出证书附加项里所有有关用途允许和用途禁止的内容。

与签名有关的otpion
本指令可以用来处理CSR和给证书签名,就象一个CA
-signkeyfilename
使用这个option同时必须提供私有密钥文件。这样把输入的文件变成字签名的证书。
如果输入的文件是一个证书,那么它的颁发者会被set成其拥有者.其他相关的项也会被改成符合自签名特征的证书项。
如果输入的文件是CSR,那么就生成自签名文件。
-clrext
把证书的扩展项删除。
-keyformPEM|DER
指定使用的私有密钥文件格式。
-daysarg
指定证书的有效时间长短。缺省为30天。
-x509toreq
把一个证书转化成CSR.用-signkey指定私有密钥文件
-req
缺省的认为输入文件是证书文件,set了这个option说明输入文件是CSR.
-CAfilename
指定签名用的CA的证书文件名。
-CAkeyfilename
指定CA私有密钥文件。如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有。
-CAserialfilename
指定CA的证书系列号文件。证书系列号文件在前面介绍过,这里不重复了。
-CAcreateserialfilename
如果没有CA系列号文件,那么本option将生成一个。
-extfilefilename
指定包含证书扩展项的文件名。如果没有,那么生成的证书将没有任何扩展项。
-extensionssection
指定文件中包含要增加的扩展项的section
上面俩个option有点难明白是吧?后面有举例。
与名字有关的option.这些option决定证书拥有者/颁发者的打印方式。缺省方式是印在一行中。
这里有必要解释一下这个证书拥有者/颁发者是什么回事。它不是我们常识里的一个名字,而是一个结构,包含很多字段。
英文分别叫subjectname/issuername.下面是一个subjectname的例子
subject=
countryName=AU
stateOrProvinceName=Some-State
localityName=gz
organizationName=ailtd
organizationalUnitName=sw
commonName=fordesign
[email protected]


-nameopt
这个option后面的参数就是决定打印的方式,其参数有以下可选:
compat
使用以前版本的格式,等于没有设置任何以下option
RFC2253
使用RFC2253规定的格式。
oneline
所有名字打印在一行里面。
multiline
名字里的各个字段用多行打印出来。
上面那几个是最常用的了,下面的这些我怎么用怎么不对,也许以后研究source在完善这里了。
esc_2253esc_ctrlesc_msbuse_quoteutf8no_typeshow_typedump_der
dump_nostrdump_alldump_unknownsep_comma_plussep_comma_plus_space
sep_semi_plus_spacesep_multilinedn_revnofname,sname,lname,oidspc_eq
举例时间:
打印出证书的内容:
opensslx509-incert.pem-noout-text
打印出证书的系列号
opensslx509-incert.pem-noout-serial
打印出证书的拥有者名字
opensslx509-incert.pem-noout-subject
以RFC2253规定的格式打印出证书的拥有者名字
opensslx509-incert.pem-noout-subject-nameoptRFC2253
在支持UTF8的终端一行过打印出证书的拥有者名字
opensslx509-incert.pem-noout-subject-nameoptoneline-nameopt-escmsb
打印出证书的MD5特征参数
opensslx509-incert.pem-noout-fingerprint
打印出证书的SHA特征参数
opensslx509-sha1-incert.pem-noout-fingerprint
把PEM格式的证书转化成DER格式
opensslx509-incert.pem-informPEM-outcert.der-outformDER
把一个证书转化成CSR
opensslx509-x509toreq-incert.pem-outreq.pem-signkeykey.pem
给一个CSR进行处理,颁发字签名证书,增加CA扩展项
opensslx509-req-incareq.pem-extfileopenssl.cnf-extensionsv3_ca-signkeykey.pem-outcacert.pem
给一个CSR签名,增加用户证书扩展项
opensslx509-req-inreq.pem-extfileopenssl.cnf-extensionsv3_usr-CAcacert.pem-CAkeykey.pem-CAcreateserial
把某证书转化成用于SSLclient可信任证书,增加别名alias
opensslx509-incert.pem-addtrustsslclient-alias"Steve‘sClass1CA"-outtrust.pem
上面有很多地方涉及到证书扩展/证书用途,这里解释一下:
我们知道一个证书是包含很多内容的,除了基本的那几个之外,还有很多扩展的项。比如证书用途,其实也只是证书扩展项中的一个。
我们来看看一个CA证书的内容:
opensslx509-inca.crt-noout-text
Certificate:
Data:
Version:3(0x2)
SerialNumber:0(0x0)
SignatureAlgorithm:md5WithRSAEncryption
Issuer:C=AU,ST=Some-State,O=InternetWidgitsPtyLtd,
CN=fordesign/[email protected]
Validity
NotBefore:Nov904:02:072000GMT
NotAfter:Nov904:02:072001GMT
Subject:C=AU,ST=Some-State,O=InternetWidgitsPtyLtd,
CN=fordesign/[email protected]
SubjectPublicKeyInfo:
PublicKeyAlgorithm:rsaEncryption
RSAPublicKey:(1024bit)
Modulus(1024bit):
00:e7:62:1b:fb:78:33:d7:fa:c4:83:fb:2c:65:c1:
08:03:1f:3b:79:b9:66:bb:31:aa:77:d4:47:ac:be:
e5:20:ce:ed:1f:b2:b5:4c:79:c9:9b:ad:1d:0b:7f:
84:49:03:6b:79:1a:fd:05:ca:36:b3:90:b8:5c:c0:
26:93:c0:02:eb:78:d6:8b:e1:91:df:85:39:33:fc:
3d:59:e9:7f:58:34:bf:be:ef:bd:22:a5:be:26:c0:
16:9b:41:36:45:05:fe:f9:b2:05:42:04:c9:3b:28:
c1:0a:48:f4:c7:d6:a8:8c:f9:2c:c1:1e:f5:8b:dc:
19:59:7c:47:f7:91:cc:5d:75
Exponent:65537(0x10001)
X509v3extensions:
X509v3SubjectKeyIdentifier:
69:41:87:55:BD:52:99:D0:F5:EC:11:7F:0A:01:53:58:4E:0B:7C:F7
X509v3AuthorityKeyIdentifier:
keyid:69:41:87:55:BD:52:99:D0:F5:EC:11:7F:0A:01:53:58:
4E:0B:7C:F7
DirName:/C=AU/ST=Some-State/O=InternetWidgitsPty
Ltd/CN=fordesign/[email protected]
serial:00
X509v3BasicConstraints:
CA:TRUE
SignatureAlgorithm:md5WithRSAEncryption
79:14:99:4a:8f:64:63:ab:fb:ad:fe:bc:ba:df:53:97:c6:92:
41:4d:de:fc:59:98:39:36:36:8e:c6:05:8d:0a:bc:49:d6:20:
02:9d:a2:5f:0f:03:12:1b:f2:af:23:90:7f:b1:6a:86:e8:3e:
0b:2c:fd:11:89:86:c3:21:3c:25:e2:9c:de:64:7a:14:82:32:
22:e1:35:be:39:90:f5:41:60:1a:77:2e:9f:d9:50:f4:81:a4:
67:b5:3e:12:e5:06:da:1f:d9:e3:93:2d:fe:a1:2f:a9:f3:25:
05:03:00:24:00:f1:5d:1f:d7:77:8b:c8:db:62:82:32:66:fd:
10:fa
是否看到我们先提到过的subjectname/issuername.本证书中这俩个字段是一样的,明显是自签名证书,是一个RootCA的证书。从X509v3extension开始就是证书扩展项了。
这里有个X509v3Basicconstraints.里面的CA字段决定该证书是否可以做CA的证书,这里是TURE。如果这个字段没有,那么会根据其他内容决定该证书是否可以做CA证书。
如果是X509v1证书,又没有这个扩展项,那么只要subjectname和issuername相同,就认为是RootCA证书了。
本例的证书没有证书用途扩展项,它是一个叫keyUseage的字段。
举个例子就可以看出该字段目前可以有以下值
opensslx509-purpose-inserver.crt
Certificatepurposes:
SSLclient:Yes
SSLclientCA:No
SSLserver:Yes
SSLserverCA:No
NetscapeSSLserver:Yes
NetscapeSSLserverCA:No
S/MIMEsigning:Yes
S/MIMEsigningCA:No
S/MIMEencryption:Yes
S/MIMEencryptionCA:No
CRLsigning:Yes
CRLsigningCA:No
AnyPurpose:Yes
AnyPurposeCA:Yes
SSLClient
SSLClientCA

每个值的具体意义应该可以看名字就知道了吧?
X509指令在转化证书成CSR的时候没有办法把证书里的扩展项转化过去给CSR签名做证书的时候,如果使用了多个option,应该自己保证这些option没有冲突。

你可能感兴趣的:(OpenSSL)