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 发表评论
最新评论
|
评论