openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM] [-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename] [-out filename] [-passin arg] [-serial] [-hash] [-subject_hash] [-subject_hash_old] [-issuer_hash] [-issuer_hash_old] [-subject] [-issuer] [-nameopt option] [-email] [-ocspid] [-ocsp_uri] [-startdate] [-enddate] [-dates] [-purpose] [-modulus] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg] [-addreject arg] [-setalias arg] [-days arg] [-checkend arg] [-set_serial n] [-signkey filename] [-x509toreq] [-req] [-CA filename] [-CAkey filename] [-CAcreateserial] [-CAserial filename] [-certopt] [-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section] [-engine id] 选项说明: 输入输出等一般选项值: -inform PEM|NET|DER:输入文件格式,DER、PEM以及NET格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。NET是为了和老的netscape server以及IIS兼容才弄出来的。他使用没有被salt过的RC4做加密算法,加密强度很底,如果不是一定要用就别用。 -outform PEM|NET|DER:输出文件格式,DER、PEM以及NET格式。同inform。 -in filename:输入的证书文件,默认为标准输入。 -out filename:输出文件,默认为标准输出。 -md2|-md5|-sha1|-mdc2:指定使用的哈希算法。缺省的是MD5于打印有关的选项。 -text:用文本方式详细打印出该证书的所有细节。 -noout:不打印出请求的编码版本信息。 -modulus:打印出公共密钥的系数值。 -serial:打印出证书的系列号。 -hash:把证书的拥有者名称的哈希值给打印出来。 -subject_hash:打印出证书拥有者信息的哈希值。 -subject_hash_old:用老式的方式打印出证书拥有者信息的哈希值。这个选项用于OpenSSL 1.0.0版本之前。 -issuer_hash:打印出证书颁发者信息的哈希值。 -issuer_hash_old:用老式的方式打印出证书颁发者信息的哈希值。这个选项用于OpenSSL 1.0.0版本之前。 -subject:打印出证书拥有者的名字。 -issuer:打印证书颁发者名字。 -nameopt option:指定用什么格式打印上俩个选项的输出。Option的值可以有一个选项或者多个选项(用逗号分开)组成。 -email:如果有,打印出证书申请者的email地址。 -startdate:打印证书的起始有效时间,即notBefore的值。 -enddate:打印证书的到期时间,即notAfter的值。 -dates:把上俩个选项都给打印出来。 -fingerprint:打印DER格式的证书的DER版本信息。 -C:用C代码风格打印结果。 -CAform DER|PEM:CA证书的格式,DER、PEM格式。默认为PEM。 -CAkeyform DER|PEM:CA密钥的ges,DER、PEM格式。默认为PEM。 -passin arg:指定私钥口令来源。 -ocspid:打印出OCSP中的颁发者信息值和证书公钥的哈希值。 -ocsp_uri:如果有的话打印出OCSP的响应地址。 与证书信任有关的选项: 一个可以信任的证书的就是一个普通证书,但有一些附加项指定其可以用于哪些用途和不可以用于哪些用途, 该证书还应该有一个"别名"。 一般来说验证一个证书的合法性的时候,相关的证书链上至少有一个证书必须是一个可以信任的证书。缺省的认为如果该证书链上的Root CA的证书可以信任,那么整条链上其他证书都可以用于任何用途。 以下的几个选项只用来验证Root CA的证书。CA在颁发证书的时候可以控制该证书的用途,比如颁发可以用于SSL client而不能用于SSL server的证书。 -trustout:打印出可以信任的证书。 -setalias arg:设置证书别名。比如你可以把一个证书叫"fordesign's certificate", 那么以后就可以使用这个别名来引用这个证书。 -alias:打印证书别名。 -clrtrust:清除证书附加项里所有有关用途允许的内容。 -clrreject:清除证书附加项里所有有关用途禁止的内容。 -addtrust arg:添加证书附加项里所有有关用途允许的内容。 -addreject arg:添加证书附加项里所有有关用途禁止的内容。 -purpose:打印出证书附加项里所有有关用途允许和用途禁止的内容。 与签名有关的otpion: 本指令可以用来处理CSR和给证书签名,就象一个CA 。 -signkey filename 使用这个选项同时必须提供私有密钥文件。这样把输入的文件变成字签名的证书。 如果输入的文件是一个证书,那么它的颁发者会被set成其拥有者。其他相关的项也会被改成符合自签名特征的证书项。 如果输入的文件是CSR, 那么就生成自签名文件。 -clrext:把证书的扩展项删除。 -keyform DER|PEM:指定使用的私有密钥的格式,DER、PEM格式。默认为PEM。 -days arg:指定证书的有效时间长短。缺省为30天。 -x509toreq:把一个证书转化成CSR。用-signkey指定私有密钥文件。 -req:缺省的认为输入文件是证书文件,set了这个选项说明输入文件是CSR。 -CA filename:指定签名用的CA的证书文件名。 -CAkey filename:指定CA私有密钥文件。如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有。 -CAserial filename:指定CA的证书系列号文件。证书系列号文件在前面介绍过,这里不重复了。 -CAcreateserial:如果没有CA系列号文件,那么本选项将生成一个。 -extensions section:指定文件中包含要增加的扩展项的section。 -extfile filename:指定包含证书扩展项的文件名。如果没有,那么生成的证书将没有任何扩展项。 -nameopt:这个选项后面的参数就是决定打印的方式,其参数有以下可选: B<compat>:使用以前版本的格式,等于没有设置任何以下选项值。 B<RFC2253>:显示RFC2253规定的格式相兼容名字,等同于下面的命令:B<esc_2253>, B<esc_ctrl>,B<esc_msb>, B<utf8>, B<dump_nostr>, B<dump_unknown>, B<dump_der>,B<sep_comma_plus>, B<dn_rev> and B<sname>。 B<oneline>:所有名字打印在一行里面。等同于下面的命令:B<esc_2253>,B<esc_ctrl>,B<esc_msb>, B<utf8>,B<dump_nostr>,B<dump_der>,B<use_quote>,B<sep_comma_plus_space>,B<space_eq>和 B<sname>。 B<multiline>:名字里的各个字段用多行打印出来。等同于下面的命令:B<esc_ctrl>,B<esc_msb>,B<sep_multiline>,B<space_eq>, B<lname> 和 B<align>。 B<esc_2253>:用RFC2253中的域<,+"E<lt>E<gt>;>来逃避掉指定的字节请求。 B<esc_ctrl>:逃避掉控制字节。ASCII字节中的0x20 (space) a和 delete (0x7f) 字节。 B<esc_msb>:用设置MSB来避免掉字节。即ASCII字节中大于127的。 B<use_quote>:用<">字节来避免掉字节。 B<utf8>:将所有的字符串转换为utf8格式。这在RFC2253中提出。如果你幸运地有一个兼容utf8的终端就可以使用这个选项。 B<no_type>:使用了本选项,在任何方式下不去试图解释多字节。 B<show_type>:显示ASN1字节的类型。 B<dump_der>:当设置了这个选项后,用DER编码域时,则需要用十六进制来复制。 B<dump_nostr>:如果这个选项没有被设置,则复制non字符类型。 B<dump_all>:复制所有的域。 B<dump_unknown>:复制没有被OpenSSL所承认的域。 B<sep_comma_plus>, B<sep_comma_plus_space>, B<sep_semi_plus_space>,B<sep_multiline>:这些选项决定域的分隔符。第一个字节在RNDS和第二个多重的AVAs之间(多重的AVAs非常少)。选项的最后字节“space”用分隔符分开后做为结束符。 B<dn_rev>:反序DN域。这个在RFC2253中明确指出。 B<nofname>, B<sname>, B<lname>, B<oid>:这些选项允许那些域名字显示。B<nofname>一直不显示所有域的名字。B<sname>使用一个“short name”;B<lname>用长的表单。B<oid>用数值来表示OID表单。 B<align>:输出的域名字排列成一行。仅仅与B<sep_multiline>结合才能使用。 B<space_eq>:用空格代替B<=>。 Ø -certopt:这个选项后面的参数就是决定证书打印的方式,其参数有以下可选: B<compatible>:使用以前版本的格式,等于没有设置任何以下选项值。 B<no_header>:不打印头部信息值。就是"Certificate" 和 "Data"。 B<no_version>:不打印版本信息值。 B<no_serial>:不打印序列号。 B<no_signame>:不打印使用的签名算法值。 B<no_validity>:不打印证书的有效期。即B<notBefore> 和 B<notAfter> 域。 B<no_subject>:不打印申请者的信息值。 B<no_issuer>:不打印颁发者信息值。 B<no_pubkey>:不打印公钥值。 B<no_sigdump>:不提供一个16进制的证书签名值。 B<no_aux>:不打印证书的可信任信息值。 B<no_extensions>:不打印任何X509V3的额外信息值。 B<ext_default>:保持额外信息的行为:打印不支持的证书的额外信息。 B<ext_error>:打印一个错误信息值。 B<ext_parse>:用ASN1分析不支持的额外信息。 B<ext_dump>:十六进制显示不支持的额外信息。 B<ca_default>:这个值用于B<ca>命令。等同于B<no_issuer>, B<no_pubkey>, B<no_header>,B<no_version>, B<no_sigdump> and B<no_signame>。 实例: 显示一个证书的上下文信息: openssl x509 -in cert.pem -noout –text 显示证书的序列号: openssl x509 -in cert.pem -noout –serial 显示证书的申请者信息值: openssl x509 -in cert.pem -noout -subject 用RFC2253表单格式显示证书申请者信息值: openssl x509 -in cert.pem -noout -subject -nameopt RFC2253 用UTF8显示证书申请者信息值,排成一行: openssl x509 -in cert.pem -noout -subject -nameopt oneline,-esc_msb 显示证书的MD5值: openssl x509 -in cert.pem -noout -fingerprint 显示证书的SHA1值: openssl x509 -sha1 -in cert.pem -noout -fingerprint 将PEM格式的证书转换为DER: openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER 从证书中提取证书请求文件: openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem 转换一个证书请求文件为自签名的CA证书: openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca \ -signkey key.pem -out cacert.pem 用CA证书签名一个证书请求文件并添加用户证书的额外信息值: openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr \ -CA cacert.pem -CAkey key.pem -CAcreateserial 设置一个证书为SSL客户端可信任的,并设置别名为"Steve's Class 1 CA": openssl x509 -in cert.pem -addtrust clientAuth \ -setalias "Steve's Class 1 CA" -out trust.pem 注意: PEM格式用的头部和尾部为: -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- 也有可能为: -----BEGIN X509 CERTIFICATE----- -----END X509 CERTIFICATE----- 可信任的证书有以下行: -----BEGIN TRUSTED CERTIFICATE----- -----END TRUSTED CERTIFICATE----- 转换为UTF8格式的过程中,name选项将会使用ISO8859-1字节来替换T61Strings。对Netscape和MSIE格式来说,这是个错误。 B<-fingerprint>选项获取DER格式的证书摘要值。这个操作一般叫做“fingerprint”。证书的fingerprint摘要值的本质是:对该证书是独特的。如果两个证书有相同的摘要值,则这两个证书内容肯定相同。 Netscape格式的证书摘要算法为MD5,MSIE格式的证书摘要算法为SHA1。 B<-email>选项查询申请者信息值和申请者的额外信息值。唯一的email地址将会被打印:不会打印同一地址多次。 证书的额外信息值: B<-purpose>选项检查证书的额外信息值和决定证书的用途。实际上的检查是复杂的,包含狠毒哦工作区,要检查他们是否是不合法的证书和软件。 在证书链中,当验证不信任的证书也将使用同样的代码。因为这个字段对验证代码已经拒绝了的证书链来说非常有用。 额外的CA标记basicConstraints将会决定证书是否可以作为CA证书来使用。如果这个标记为true,则可以作为一个CA,如果不为true,则不能够作为CA。B<All>中的CA列表中的CA的这个标记必须为true。 如果缺少basicConstraints信息值,则这个证书有可能是CA。将会给出一个警告信息,因为该证书没有被当做一个CA:无论怎样,允许一个CA证书工作在一些坏的软件中。 如果证书是一个V1证书(没有额外信息值),并且是自签名证书,它会被假设为一个CA,但是会给出一个警告:这是一个有问题的根证书,该证书是一个自签名的V1证书。 如果密钥用法额外信息存在,则附加的约束将会作用到该证书上。如果密钥用法额外信息存在,则一个CA证书必须有keyCertSign字节数被设置。 如果扩展密钥用法存在,则附加的约束将会作用到该证书上。如果扩展密钥用法存在,密钥仅仅能够用于指定的证书用途。 对每个测试有一个完整的描述,如下: B<SSL Client>:扩展密钥用法必须不存在或包含“web client authentication”OID值。密钥用法必须不存在或者必须要设置digitalSignature字节。Netscape类型必须不存在或者必须要设置SSL Client字节。 B<SSL Client CA>:扩展密钥用法必须不存在或包含“web client authentication”OID值。Netscape类型必须不存在或者必须要设置SSL Client字节:如果basicConstraints额外信息不存在,它将会使用。 B<SSL Server>:扩展密钥用法必须不存在或包含“web server authentication”OID值。密钥用法必须不存在或者必须有digitalSignature,keyEncipherment设置或者两者都要设置。Netscape类型必须不存在或者必须要设置SSL Server字节。 B<SSL Server CA>:扩展密钥用法必须不存在或包含“web server authentication”OID值。Netscape类型必须不存在或者必须要设置SSL Server字节:如果basicConstraints额外信息不存在,它将会使用。 B<Netscape SSL Server>:如果密钥用法存在,Netscape格式的SSL 客户端必须要有keyEncipherment字节被设置后才能连接到服务器。这个选项不是有效的因为一些算法套件要用密钥进行数字签名。要不然就和普通的SSL Server一样。 B<Common S/MIME Client Tests>:扩展密钥用法必须不存在或包含“email protection”OID值。Netscape类型必须不存在或者必须要设置S/MIME字节。如果在Netscape 格式证书中,S/MIME字节没有被设置,SSL client字节将会默许作为一个可供选择。但是一个警告将会显示:这是因为一些证书没有设置S/MIME字节。 B<S/MIME Signing>:如果该扩展密钥用法存在,则普通的S/MIME客户端必须设置digitalSignature字节。 B<S/MIME Encryption>:如果该扩展密钥用法存在,则普通的S/MIME客户端必须设置keyEncipherment字节。 B<S/MIME CA>:扩展密钥用法必须不存在或包含“email protection”OID值。Netscape类型必须不存在或者必须要设置S/MIME CA字节:如果basicConstraints额外信息不存在,它将会使用。 B<CRL Signing>:扩展密钥用法必须不存在或或者必须要设置CRL signing字节。 B<CRL Signing CA>:普通CA测试申请。 ---------------------------------------------------------------------------------------------------------- OpenSSH和ssh-keygen OpenSSH是SSH协议的开源版本(SSH:Secure SHell)。使用SSH透过计算机网络实现加密通讯,可以进行远程控制,在计算机之间传送文件等等。SSH传输的数据都进行了加密,比telnet,rcp,ftp,rlogin,rsh等以明文传输密码的工具更安全。 OpenSSH提供了实现SSH协议的很多工具。其中ssh-keygen用于生成,管理和转换用于认证的密钥和证书。 ssh-keygen -b <bits> 密钥长度,默认为2048 -t <type> 密钥类型, rsa|des... (默认类型为rsa) SSH1: RSA SSH2: RSA, DSA, ECDSA -N <password> 新密码 -f <file> 指定密钥文件,创建时会同时生成一个.pub结尾的公钥文件。 -C <comment> -c 修改公钥或私钥文件中的注释 -p 修改私钥文件密码 -P <password> 旧密码 -e 导出为其它格式的密钥文件,可以转换密钥类型 -i 从其他格式的密钥文件导入,可以转换密钥类型 -m <PEM|PKCS8|RFC4716> 与-e,-i配合使用,指明导出或导入的密钥文件格式 -y 读入密钥并显示公钥 OpenSSL OpenSSL 是一个强大的安全套接字层密码库,包括了加密算法,常用密钥和证书管理,SSL协议等功能。OpenSSL提供的命令非常多,这里只简单列出OpenSSL生成密钥和证书的一些操作(Window需要以管理员身份运行cmd). v1.0.1+密钥默认采用PKCS#8格式(之前版本为PEM) 查看openSSL版本 $openssl version $openssl version -a 密钥生成(genrsa,genpkey,req在证书请求时同时生成密钥,gendh,gendsa) (1) openssl genrsa [options] [bits_num] -out <file>指定输出文件,不指定时在终端显示密钥内容 -passout pass: <password> 设置私钥文件密码 -f4 使用F4(0x10001)作为公钥的E参数(默认) -3 使用3作为公钥的E参数 -des , -des3, -aes128, -aes192, -aes256 指定加密算法(默认不加密) 默认生产的密钥格式为PEM。openssl默认只生成了私钥文件,当需要提取公钥时使用rsa命令 示例 openssl -out rsakey0.pem -des3 -out rootca.key -passout pass: (2) openssl genpkey [options] v1.0.1+ 示例 #生成RSA密钥,位长度为2048,格式为DER openssl genpkey -algorithm RSA -out rsapriKey.pem -pkeyopt rsa_keygen_bits: -outform DER (3) openssl req请求时生成新的密钥对 示例 openssl req -x509 -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes 2.密钥文件管理和转换(rsa, pkey) (1) openssl rsa [options] <infile >outfile -in <infile> 输入密钥文件 -passin pass:<password> 输入密钥保护密码 -inform <DER|NET|PEM> 输入密钥格式,默认为PEM -out <outfile> 输出密钥文件 -outform <DER|NET|PEM> 输出密钥格式,默认为PEM -passout pass:<password> 输出密钥保护密码 -pubin 指示输入的是公钥,默认输出的是密钥对或私钥 -pubout 输出公钥到文件(公钥一般无需加密) -des, -des3, -aes128, -aes192, -aes256 指定密钥加密算法 -text 明文输出密钥参数 -noout 不输出密钥到文件 -check 验证一致性 -modulus 显示RSA密钥模值 示例 opensll -in rsakey0.pem -pubout -- rsakeypair.der -inform DER -out rsakeypair.pem #改加密算法,移除密码保护 openssl rsa -in rsakeypair.pem -passin pass:123456 -des3 -out rsakeypair1.pem |
|