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地址 -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没有冲突。 |