openssl的man中文文档(转)

openssl简介-指令dhparam

    用法:
   
    openssl dhparam [-inform DER|PEM] [-outform DER|PEM] [-in filename]
   
    [-out filename] [-dsaparam] [-noout] [-text] [-C] [-2] [-5]
   
    [-rand file(s)] [numbits]
   
     
    描述:
    本指令用来维护DH的参数文件。
   
    OPTIONS:
    -inform DER|PEM
    指定输入的格式是DEM还是DER. DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key, .crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
    -outform DER|PEM
    和上一个差不多,不同的是指定输出格式
    -in filename
    要分析的文件名称。
    -out filename
    要输出的文件名。
    -dsaparam
    如果本option被set, 那么无论输入还是输入都会当做DSA的参数。它们再被转化成DH的参数格式。这样子产生DH参数和DH key都会块很多。会使SSL握手的时间缩短。当然时间是以安全性做牺牲的,所以如果这样子最好每次使用不同的参数,以免给人K破你的key.
     -2, -5
    使用哪个版本的DH参数产生器。版本2是缺省的。如果这俩个option有一个被set, 那么将忽略输入文件。
   
     -rand file(s)
    产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
    numbits
    指明产生的参数的长度。必须是本指令的最后一个参数。如果没有指明,则产生512bit长的参数。
   
     
    -noout
    不打印参数编码的版本信息。
    -text
    将DH参数以可读方式打印出来。
    -C
    将参数转换成C代码方式。这样可以用get_dhnumbits()函数调用这些参数。
   
    openssl还有俩个指令, dh, gendh, 现在都过时了,全部功能由dhparam实现。
    现在dh, gendh这俩个指令还保留,但在将来可能会用做其他用途。
openssl简介-指令enc

    用法:
   
    openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e]
   
    [-d] [-a] [-k password] [-kfile filename] [-K key] [-iv IV] [-p]
   
    [-P] [-bufsize number] [-debug]
   
        
    说明:
    对称加密算法工具。它能够把数据用不同对称加密算法来加/解密。还能够把加密/接密,还可以把结果进行base64编码。
   
    OPTIONS
    -in filename
    要加密/解密的输入文件,缺省为标准输入。
    -out filename
    要加密/解密的输出文件,缺省为标准输出。
    -pass arg
    输入文件如果有密码保护,在这里输入密码。
    -salt
    为了和openssl0.9.5以后的版本兼容,必须set这个option.salt大概又是密码学里的一个术语,具体是做什么的我也没弄的很明白。就我的理解,这是加密过后放在密码最前面的一段字符串, 用途也是为了让破解更难.如果理解错了,请密码学高手指正.
    -nosalt
    想和openssl0.9.5以前的版本兼容,就set这个option
    -e
    一个缺省会set的option, 把输入数据加密。
    -d
    解密输入数据。
    -a
    用base64编码处理数据。set了这个option表示在加密之后的数据还要用base64编码捏一次,解密之前则先用base64编码解码。
    -k password
    一个过时了的项,为了和以前版本兼容。现在用-key代替了。
    -kfile filename
    同上,被passin代替。
    -K key
    以16进制表示的密码。
    -iv IV
   作用完全同上。
    -p
    打印出使用的密码。
    -P
    作用同上,但打印完之后马上退出。
    -bufsize number
    设置I/O操作的缓冲区大小
    -debug
    打印调试信息。
   
注意事项:
    0.9.5以后的版本,使用这个指令,-salt是必须被set的。否则很容易用字典攻击法破你的密码,流加密算法也容易被破。(加密算法中有块加密算法和流加密算法俩种,块加密算法是一次加密固定长度的数据,一般是8Bytes, 流加密算法则加密大量数据)。为什么我也弄不清楚。研究加密算法实在麻烦,也不是我们程序员的责任本指令可以用不同加密算法,那么哪些好,哪些坏呢?如果你使用不当,高强度的加密算法也变脆弱了。一般推荐新手门使用des3-cbc。
   
    本指令支持的加密算法
    base64 Base 64
    bf-cbc Blowfish in CBC mode
   
     bf Alias for bf-cbc
   
     bf-cfb Blowfish in CFB mode
   
     bf-ecb Blowfish in ECB mode
   
     bf-ofb Blowfish in OFB mode
   
     
   
     cast-cbc CAST in CBC mode
   
     cast Alias for cast-cbc
   
     cast5-cbc CAST5 in CBC mode
   
     cast5-cfb CAST5 in CFB mode
   
     cast5-ecb CAST5 in ECB mode
   
     cast5-ofb CAST5 in OFB mode
    des-cbc DES in CBC mode
   
     des Alias for des-cbc
   
     des-cfb DES in CBC mode
   
     des-ofb DES in OFB mode
   
     des-ecb DES in ECB mode
   
         
     des-ede-cbc Two key triple DES EDE in CBC mode
   
     des-ede Alias for des-ede
   
     des-ede-cfb Two key triple DES EDE in CFB mode
   
     des-ede-ofb Two key triple DES EDE in OFB mode
   
   
   
     des-ede3-cbc Three key triple DES EDE in CBC mode
   
     des-ede3 Alias for des-ede3-cbc
   
     des3 Alias for des-ede3-cbc
   
     des-ede3-cfb Three key triple DES EDE CFB mode
   
     des-ede3-ofb Three key triple DES EDE in OFB mode
   
      desx DESX algorithm.
   
      idea-cbc IDEA algorithm in CBC mode
   
     idea same as idea-cbc
   
     idea-cfb IDEA in CFB mode
   
     idea-ecb IDEA in ECB mode
   
     idea-ofb IDEA in OFB mode
   
     
   
     rc2-cbc 128 bit RC2 in CBC mode
   
     rc2 Alias for rc2-cbc
   
     rc2-cfb 128 bit RC2 in CBC mode
   
     rc2-ecb 128 bit RC2 in CBC mode
   
     rc2-ofb 128 bit RC2 in CBC mode
   
     rc2-64-cbc 64 bit RC2 in CBC mode
   
     rc2-40-cbc 40 bit RC2 in CBC mode
   
         
     rc4 128 bit RC4
   
     rc4-64 64 bit RC4
   
     rc4-40 40 bit RC4
   
         
     rc5-cbc RC5 cipher in CBC mode
   
     rc5 Alias for rc5-cbc
   
     rc5-cfb RC5 cipher in CBC mode
   
     rc5-ecb RC5 cipher in CBC mode
   
     rc5-ofb RC5 cipher in CBC mode
   
    大家可能看到DES都分des-ecb, des-cbc, des-cfb这些。简单解释一下。
    ecb就是说每来8bytes,就加密8bytes送出去。各个不同的数据块之间没有任何联系。cbc和cfb则每次加密一个8bytes的时候都和上一个8bytes加密的结果有一个运算法则。各个数据块之间是有联系的。
    举例时间:
    把某二进制文件转换成base64编码方式:
    openssl base64 -in file.bin -out file.b64
    把某base64编码文件转换成二进制文件。
    openssl base64 -d -in file.b64 -out file.bin
    把某文件用DES-CBC方式加密。加密过程中会提示你输入保护密码。
   
     openssl des3 -salt -in file.txt -out file.des3
    解密该文件, 密码通过-k来输入
    openssl des3 -d -salt -in file.des3 -out file.txt -k mypassword
    加密某文件,并且把加密结果进行base64编码。用bf+cbc算法加密
    openssl bf -a -salt -in file.txt -out file.bf
    先用base64解码某文件,再解密
    openssl bf -d -salt -a -in file.bf -out file.txt
openssl简介-指令gendsa

    用法:
   
    openssl gendsa [-out filename] [-des] [-des3] [-idea]
   
    [-rand file(s)] [paramfile]
   
     
        
    描述:
   
    本指令由DSA参数来产生DSA的一对密钥。dsa参数可以用dsaparam来产生。
   
    OPTIONS
    -des|-des3|-idea
    采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。
    如果这三个中一个也没set, 我们的密钥将不被加密而输入。
    -rand file(s)
    产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
    paramfile
    指定使用的DSA参数文件。
openssl简介-指令genrsa

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

    SYNOPSIS
   
    openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin]
   
    [-quiet] [-table] {password}
   
     
   
    说明:
    本指令计算用来哈希某个密码,也可以用来哈希文件内容。
    本指令支持三种哈希算法:
    UNIX系统的标准哈希算法(crypt)
    MD5-based BSD(1)
   
    OPTIONS
   -crypt -1 -apr1
    这三个option中任意选择一个作为哈希算法,缺省的是-crypt
    -salt string
    输入作为salt的字符串。
    -in file
    要哈希的文件名称
    -stdin
    从标准输入读入密码
    -quiet
    当从标准输入读密码,输入的密码太长的时候,程序将自动解短它。这个option的
    set将不在情况下发出警告。
    -table
    在输出列的时候,先输出明文的密码,然后输出一个TAB,再输出哈希值.
    举例时间:
    openssl passwd -crypt -salt xx password xxj31ZMTZzkVA.
    openssl passwd -1 -salt xxxxxxxx password $1$xxxxxxxx$8XJIcl6ZXqBMCK0qFevqT1.
    openssl passwd -apr1 -salt xxxxxxxx password $apr1$xxxxxxxx$dxHfLAsjHkDRmG83UXe8K0
openssl简介-指令pkcs7
  用法:
    openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename]
   
    [-out filename] [-print_certs] [-text] [-noout]
   
   
    说明:
    处理PKCS#7文件的工具,
   
    OPTIONS
    -inform DER|PEM
    指定输入的格式是DEM还是DER. DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key, .crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
    -outform DER|PEM
    和上一个差不多,不同的是指定输出格式
    -in filename
    要分析的文件名称, 缺省是标准输入.
    -out filename
    要输出的文件名, 缺省是标准输出.
    write to or standard output by default.
    -print_certs
    打印出该文件内的任何证书或者CRL.
    -text
    打印出证书的细节.
    -noout
    不要打印出PKCS#7结构的编码版本信息.
    举例时间:
    把一个PKCS#7文件从PEM格式转换成DER格式
    openssl pkcs7 -in file.pem -outform DER -out file.der
    打印出文件内所有的证书
    openssl pkcs7 -in file.pem -print_certs -out certs.pem
    PCKS#7 文件的开始和结束俩行是这样子的:
    -----BEGIN PKCS7-----
    -----END PKCS7-----
    为了和某些猥琐CA兼容,这样子的格式也可以接受
    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    好象我们还没有解释pkcs#7是什么东西. 有兴趣的可以看看rfc2315, 估计看完目录还没有阵亡的同学不会超过1/10.
openssl简介-指令rand

    用法:
   
    openssl rand [-out file] [-rand file(s)] [-base64] num
   
        
    描述:
    用来产生伪随机字节. 随机数字产生器需要一个seed, 先已经说过了,在没有/dev/srandom系统下的解决方法是自己做一个~/.rnd文件.如果该程序能让随机数字产生器很满意的被seeded,程序写回一些怪怪的东西回该文件.
   
    OPTIONS
   -out file
   输出文件.
   -rand file(s)
   产生随机数字的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
   -base64
   对产生的东西进行base64编码
   num
  指明产生多少字节随机数.
openssl简介-指令req

    用法:
   
    openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename]
   
    [-passin arg] [-out filename] [-passout arg] [-text] [-noout]
   
    [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa]
   
    [-newkey dsa] [-nodes] [-key filename] [-keyform PEM|DER]
   
    [-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename]
   
    [-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section]
   
    [-reqexts section]
   
     描述:
    本指令用来创建和处理PKCS#10格式的证书.它还能够建立自签名证书,做Root CA.
         
    OPTIONS
    -inform DER|PEM
    指定输入的格式是DEM还是DER. DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key, .crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
    -outform DER|PEM
    和上一个差不多,不同的是指定输出格式
    -in filename
    要处理的CSR的文件名称,只有-new和-newkey俩个option没有被set,本option才有效
    -passin arg
    去看看CA那一章关于这个option的解释吧。
     -out filename
    要输出的文件名
    -passout arg
    参看dsa指令里的passout这个option的解释吧.
   -text
   将CSR文件里的内容以可读方式打印出来
    -noout
    不要打印CSR文件的编码版本信息.
    -modulus
    将CSR里面的包含的公共米要的系数打印出来.
    -verify
    检验请求文件里的签名信息.
    -new
    本option产生一个新的CSR, 它会要用户输入创建CSR的一些必须的信息.至于需要哪些信息,是在config文件里面定义好了的.如果-key没有被set, 那么就将根据config文件里的信息先产生一对新的RSA密钥
    -rand file(s)
    产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed.
    -newkey arg
    同时生成新的私有密钥文件和CSR文件. 本option是带参数的.如果是产生RSA的私有密钥文件,参数是一个数字, 指明私有密钥bit的长度. 如果是产生DSA的私有密钥文件,参数是DSA密钥参数文件的文件名.
    -key filename
    参数filename指明我们的私有密钥文件名.允许该文件的格式是PKCS#8.
    -keyform DER|PEM
    指定输入的私有密钥文件的格式是DEM还是DER. DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key, .crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
    -outform DER|PEM
    和上一个差不多,不同的是指定输出格式
    -keyform PEM|DER
    私有密钥文件的格式, 缺省是PEM
    -keyout filename
    指明创建的新的私有密钥文件的文件名. 如果该option没有被set, 将使用config文件里面指定的文件名.
    -nodes
    本option被set的话,生成的私有密钥文件将不会被加密.
    -[md5|sha1|md2|mdc2]
    指明签发的证书使用什么哈希算法.如果没有被set, 将使用config文件里的相应item的设置. 但DSA的CSR将忽略这个option, 而采用SHA1哈希算法.
    -config filename
    使用的config文件的名称. 本option如果没有set, 将使用缺省的config文件.
    -x509
    本option将产生自签名的证书. 一般用来错测试用,或者自己玩下做个Root CA.证书的扩展项在 config文件里面指定.
   -days n
   如果-509被set, 那么这个option的参数指定我们自己的CA给人家签证书的有效期.缺省是30天.
    -extensions section -reqexts section
    这俩个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", 有的软件(netscape certificate server)和有的CA就有这样子的怪癖嗜好.如果那些必须要的option的参数没有在命令行给出,那么就会到config文件里去查看是否有缺省值, 然后时候。config文件中相关的一些KEY的解释与本指令有关的KEY都在[req]这个section里面.
    input_password output_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的格式如下:
    其格式有俩种, 如果KEY prompt被set成no(看看prompt的解释), 那么这个secion的格式看起来就是这样子的:
     CN=My Name
    OU=My Organization
    emailAddress=someone@somewhere.org
    就说只包括了字段和值。这样子可以可以让其他外部程序生成一个摸板文件,包含所有字段和值, 把这些值提出来.等下举例时间会有详细说明.如果prompt没有被set成no, 那么这个section的格式则如下:
    fieldName="please input ur name"
   
     fieldName_default="fordesign"
   
     fieldName_min= 3
   
     fieldName_max= 18
   
    "fieldname"就是字段名, 比如commonName(或者CN). fieldName(本例中是"prompt"是用来提示用户输入相关的资料的.如果用户什么都不输, 那么就使用确省值.如果没有缺省值, 那么该字段被忽略.用户如果输入 '.' ,也可以让该字段被忽略.
    用户输入的字节数必须在fieldName_min和fieldName_max之间. 不同的section还可能对输入的字符有特殊规定,比如必须是可打印字符.那么在本例里面, 程序的表现将如下:
    首先把fieldName打印出来给用户以提示
    please input ur name:
    之后如果用户必须输入3到18之间的一个长度的字符串, 如果用户什么也不输入,那么就把fieldName_default里面的值"fordesign"作为该字段的值添入.
    有的字段可以被重复使用.这就产生了一个问题, config文件是不允许同样的section文件里面有多于一个的相同的key的.其实这很容易解决,比如把它们的名字分别叫做 "1.organizationName", "2.organizationName"
    openssl在编译的时候封装了最必须的几个字段, 比如commonName, countryName, localityName, organizationName,organizationUnitName, stateOrPrivinceName还增加了emailAddress surname, givenName initials 和 dnQualifier.
    举例时间:
    就使用确省值.如果没有缺省值, 那么该字段被忽略.用户如果输入 '.' ,也可以让该字段被忽略.用户输入的字节数必须在fieldName_min和fieldName_max之间. 不同的section还可能对输入的字符有特殊规定,比如必须是可打印字符.那么在本例里面, 程序的表现将如下:
    首先把fieldName打印出来给用户以提示
    please input ur name:
    之后如果用户必须输入3到18之间的一个长度的字符串, 如果用户什么也不输入,那么就把fieldName_default里面的值"fordesign"作为该字段的值添入.
    有的字段可以被重复使用.这就产生了一个问题, config文件是不允许同样的section文件里面有多于一个的相同的key的.其实这很容易解决,比如把它们的名字分别叫做 "1.organizationName", "2.organizationName" openssl在编译的时候封装了最必须的几个字段,比如commonName,countryName,localityName, organizationName,organizationUnitName, stateOrPrivinceName还增加了emailAddress surname, givenName initials 和 dnQualifier.
    举例时间:
    Examine and verify certificate request:
    检查和验证CSR文件.
    openssl req -in req.pem -text -verify -noout
    做自己的私有密钥文件, 然后用这个文件生成CSR文件.
    openssl genrsa -out key.pem 1024
    openssl req -new -key key.pem -out req.pem
    也可以一步就搞定:
    openssl req -newkey rsa:1024 -keyout key.pem -out req.pem
    做一个自签名的给Root CA用的证书:
    openssl req -x509 -newkey rsa:1024 -keyout key.pem -out crt.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 = Country Name (2 letter code)
    countryName_default = AU
    countryName_min = 2
    countryName_max = 2
    localityName = Locality Name (eg, city)
    organizationalUnitName = Organizational Unit Name (eg, section)
    commonName = Common Name (eg, YOUR name)
    commonName_max = 64
    emailAddress = Email Address
    emailAddress_max = 40
    [ req_attributes ]
    challengePassword = A challenge password
    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 = Test State or Province
    L = Test Locality
    O = Organization Name
    OU = Organizational Unit Name
    CN = Common Name
    emailAddress = test@email.address
    [ req_attributes ]
    challengePassword = A challenge password
    一般的PEM格式的CSR文件的开头和结尾一行如下
    -----BEGIN CERTIFICATE REQUEST----
    -----END CERTIFICATE REQUEST----
    但个把变态软件和CA硬是需要CSR的文件要这样子:
    -----BEGIN NEW CERTIFICATE REQUEST----
    -----END NEW CERTIFICATE REQUEST----
    用-newhdr就可以啦, 或者你自己手工加也中.openssl对俩种格式都承认.
    openssl的config文件也可以用环境变量OPENSSL_CONF或者SSLEAY_CONF来指定.
openssl简介-指令rsa
    用法
   
    openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename]
   
    [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3]
   
    [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout]
   
   
    说明:
   rsa指令专门处理RSA密钥.其实其用法和dsa的差不多.
   
    OPTIONS
    -inform DER|PEM|NET
    指定输入的格式是DEM还是DER还是NET.注意, 这里多了一种格式,就是NET,DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式.你去看看你做出来的那些.key, .crt文件一般都是PEM格式的,第一行和最后一行指明内容,中间就是经过编码的东西。NET格式在本章后面会详细解释.
    -outform DER|PEM|NET
    和上一个差不多,不同的是指定输出格式
    -in filename
    要分析的文件名称。如果文件有密码保护,会要你输入的.
    -passin arg
    去看看CA那一章关于这个option的解释吧。
    -out filename
    要输出的文件名。
    -passout arg
    没什么用的一个选项,用来把保护key文件的密码输出的,意义和passin差不多。
    -sgckey
    配合NET格式的私有密钥文件的一个option, 没有必要去深入知道了。
    -des|-des3|-idea
    指明用什么加密算法把我们的私有密钥加密。加密的时候会需要我们输入密码来保护该文件的。如果这仨一个都没有选,那么你的私有密钥就以明文写进你的key文件。该选项只能输出PEM格式的文件。
    -text
    打印出私有密钥的各个组成部分.
    -noout
    不打印出key的编码版本信息。
    -modulus
    把其公共密钥的值也打印出来
    -pubin
    缺省的来说是从输入文件里读到私有密钥,这个就可以从输入文件里去读公共密钥.
    -pubout
    缺省的来说是打印出私有密钥,这个就可以打印公共密钥.如果上面那个选项有set那么这个选项也自动被set.
    -check
    检查RSA的私有密钥是否被破坏了这个指令实在和dsa太相似了。copy的我手软。
    现在解释一下NET是一种什么格式。它是为了和老的netscape server以及IIS兼容才弄出来的。他使用没有被salt过的RC4做加密算法,加密强度很底,如果不是一定要用就别用。
    举例时间:
    把RSA私有密钥文件的保护密码去掉(最好别这么做)
    openssl rsa -in key.pem -out keyout.pem
    用DES3算法加密我们的私有密码文件:
    openssl rsa -in key.pem -des3 -out keyout.pem
    把一个私有密钥文件从PEM格式转化成DER格式:
    openssl rsa -in key.pem -outform DER -out keyout.der
    把私有密钥的所有内容详细的打印出来:
    openssl rsa -in key.pem -text -noout
    只打印出公共密钥部分:
    openssl rsa -in key.pem -pubout -out pubkey.pem
openssl简介-指令rsautl
    用法:
   
    openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin]
   
    [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump]
   
    [-asn1parse]
   
     
    描述:
    本指令能够使用RSA算法签名,验证身份, 加密/解密数据。
   
    OPTIONS
    -in filename
    指定输入文件名。缺省为标准输入。
    -out filename
    指定输入文件名, 缺省为标准输出。
    -inkey file
    指定我们的私有密钥文件, 格式必须是RSA私有密钥文件。
    -pubin
    指定我们的公共密钥文件。说真的我还真不知道RSA的公共密钥文件有什么用,一般公共密钥都是放在证书里面的。
    -certin
    指定我们的证书文件了。
    -sign
    给输入的数据签名。需要我们的私有密钥文件。
    -verify
    对输入的数据进行验证。
    -encrypt
    用我们的公共密钥对输入的数据进行加密。
    -decrypt
    用RSA的私有密钥对输入的数据进行解密。
    -pkcs, -oaep, -ssl, -raw
   采用的填充模式, 上述四个值分别代表:PKCS#1.5(缺省值), PKCS#1 OAEP, SSLv2里面特定的填充模式,或者不填充。如果要签名,只有-pkcs和-raw可以使用.
    -hexdump
    用十六进制输出数据。
    -asn1parse
    对输出的数据进行ASN1分析。看看指令asn1parse吧。该指令一般和-verify一起用的时候威力大。
    本指令加密数据的时候只能加密少量数据,要加密大量数据,估计要调API.我也没试过写RSA加密解密的程序来玩。
    举例时间:
    用私有密钥对某文件签名:
    openssl rsautl -sign -in file -inkey key.pem -out sig
    注意哦, 文件真的不能太大, 这个不能太大意思是必须很小。
    文件大小最好不要大过73。绝对不能多过150,多了就会出错。
    这个工具真是用来玩的
   
    对签名过的数据进行验证,得到原来的数据。
    openssl rsautl -verify -in sig -inkey key.pem
    检查原始的签名过的数据:
    openssl rsautl -verify -in sig -inkey key.pem -raw -hexdump
   
     0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
   
     0070 - ff ff ff ff 00 68 65 6c-6c 6f 20 77 6f 72 6c 64 .....hello world
    很明显,这是PKCS#1结构:使用0xff填充模式。
    配合指令asn1parse,可以分析签名的证书,我们在req指令里说了怎么做自签名的证书了,现在来分析一下先。
    openssl asn1parse -in pca-cert.pem
   
    0:d=0 hl=4 l= 742 cons: SEQUENCE
   
     4:d=1 hl=4 l= 591 cons: SEQUENCE
   
     8:d=2 hl=2 l= 3 cons: cont [ 0 ]
   
     10:d=3 hl=2 l= 1 prim: INTEGER :02
   
     13:d=2 hl=2 l= 1 prim: INTEGER :00
   
     16:d=2 hl=2 l= 13 cons: SEQUENCE
   
     18:d=3 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption
   
     29:d=3 hl=2 l= 0 prim: NULL
   
     31:d=2 hl=2 l= 92 cons: SEQUENCE
   
     33:d=3 hl=2 l= 11 cons: SET
   
     35:d=4 hl=2 l= 9 cons: SEQUENCE
   
     37:d=5 hl=2 l= 3 prim: OBJECT :countryName
   
     42:d=5 hl=2 l= 2 prim: PRINTABLESTRING :AU
   
     ....
   
     599:d=1 hl=2 l= 13 cons: SEQUENCE
   
     601:d=2 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption
   
     612:d=2 hl=2 l= 0 prim: NULL
   
     614:d=1 hl=3 l= 129 prim: BIT STRING
   
    最后一行BIT STRING就是实际的签名。我们可以这样子捏它出来:
    openssl asn1parse -in pca-cert.pem -out sig -noout -strparse 614
   还可以这样子把公共密钥给弄出来:
    openssl x509 -in test/testx509.pem -pubkey -noout >;pubkey.pem
    我们也可以这样子分析签名:
    openssl rsautl -in sig -verify -asn1parse -inkey pubkey.pem -pubin
    0:d=0 hl=2 l= 32 cons: SEQUENCE
   
     2:d=1 hl=2 l= 12 cons: SEQUENCE
   
     4:d=2 hl=2 l= 8 prim: OBJECT :md5
   
     14:d=2 hl=2 l= 0 prim: NULL
   
     16:d=1 hl=2 l= 16 prim: OCTET STRING
   
     0000 - f3 46 9e aa 1a 4a 73 c9-37 ea 93 00 48 25 08 b5 .F...Js.7...H%..
   
    这是经过分析后的ASN1结构。可以看出来使用的哈希算法是md5. (很抱歉,我自己试这一行的时候输出结果却完全不同。
    0:d=0 hl=2 l= 120 cons: appl [ 24 ]
    length is greater than 18
    完全没有办法看出那里有写哈希算法。)
    证书里面的签名部分可以这么捏出来:
    openssl asn1parse -in pca-cert.pem -out tbs -noout -strparse 4
    这样得到他的哈希算法的细节:
    openssl md5 -c tbs
    MD5(tbs)= f3:46:9e:aa:1a:4a:73:c9:37:ea:93:00:48:25:08:b5