zoukankan      html  css  js  c++  java
  • openssl 使用命令帮助

    Openssl命令总览

    语法格式:
    openssl command [ command_opts ] [ command_args ]

    常用command:

      version  用于查看版本信息

      enc    用于加解密

      ciphers   列出加密套件

      genrsa    用于生成私钥

      rsa    RSA密码管理

      req    生成证书签名请求(CSR)

      crl    证书吊销列表(CRL) 管理

      ca    CA管理(例如对证书进行签名)

      dgst   生成信息摘要

      rsautl  用于完成RSA签名、验证、加密和解密功能

      passwd  生成散列密码

      pkey   命令处理公钥或私钥。它们可以在各种形式之间进行转换,并将其结构打印出来。 

      rand    生成伪随机数

      speed    用于测试加解密速度

      s_client  通用的SSL/TLS客户端测试工具

      X509    X.509证书管理

      verify   X.509证书验证

      pkcs7    PKCS#7协议数据管理

    OpenSSL命令  --version:

    语法
    
    openssl version [-a] [-v] [-b] [-o] [-f] [-p] [-d]
    
    -a:打印所有信息。
    -v:仅打印版本信息
    -b:打印当前版本构建的日期
    -o:库构建时的相关信息
    -f:编译参数
    -p:平台信息
    -d: 列出openssl的安装目录

    OpenSSL命令---enc:

    用途:

    对称加密算法工具。它能够运用块或流算法对数据进行加解密。还能够将加解密的结果进行base64编码。

    用法:
    openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt][-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

    选项说明:

    -ciphername:对称算法名称,此命令有两种使用方式:-ciphername方式或者省略enc直接使用ciphername。

    -in filename:要加密/解密的输入文件,默认为标准输入。

    -out filename:要加密/解密的输出文件,默认为标准输出。

    -pass arg:输入文件如果有密码保护,指定密码来源。

    -e:进行加密操作,默认操作。可以省略

    -d:进行解密操作。

    -a:使用base64编码对加密结果进行处理。加密后进行base64编码,解密前进行base64解密。

    -base64:同-a选项。

    -A:默认情况下,base64编码为一个多行的文件。使用此选项,可以让生成的结果为一行。解密时,必须使用同样的选项,否则读取数据时会出错。

    -k:指定加密口令,不设置此项时,程序会提示用户输入口令。

    -kfile:指定口令存放文件。可以从这个口令存放文件的第一行读取加密口令。

    -K key:使用一个16进制的输入口令。如果仅指定-K key而没有指定-k password,必须用-iv选项指定IV。当-K key和-k password都指定时,用-K选项给定的key将会被使用,而使用password来产生初始化向量IV。不建议两者都指定。

    -iv IV:手工指定初始化向量(IV)的值。IV值是16进制格式的。如果仅使用-K指定了key而没有使用-k指定password,那么就需要使用-iv手工指定IV值。如果使用-k指定了password,那么IV值会由这个password的值来产生。

    -salt:产生一个随机数,并与-k指定的password串联,然后计算其Hash值来防御字典攻击和rainbow table攻击。

           rainbow table攻击:用户将密码使用单向函数得到Hash摘要并存入数据库中,验证时,使用同一种单向函数对用户输入口令进行Hash得到摘要信息。将得到的摘要信息和数据中该用户的摘要信息进行比对,一致则通过。考虑到多数人使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向Hash,得到一个摘要组合。然后与数据库中的摘要进行比对即可获得对应的密码。

          salt将随机数加入到密码中,然后对一整串进行单向Hash。攻击者就很难通过上面的方式来得到密码。

    -S salt:使用16进制的salt。

    -nosalt:表示不使用salt。

    -z:压缩数据(前提是OpenSSL编译时加入了zip库)。

    -md:指定摘要算法。如:MD5  SHA1  SHA256等。

    -p:打印出使用的salt、口令以及初始化向量IV。

    -P:打印出使用的salt、口令以及IV,不做加密和解密操作,直接退出。

    -bufsize number:设置I/O操作的缓冲区大小。因为一个加密的文件可能会很大,每次能够处理的数据是有限的。

    -nopad:没有数据填充(主要用于非对称加密操作)。

    -debug:打印调试信息。

    -none:不对数据进行加密操作。

    -engine:指定硬件引擎。

    注意: 密码可以用来产生初始化密钥key和初始化向量IV。

           新版的OpenSSL必须使用-salt选项。

    OpenSSL支持的加密算法:des  des3  bf  cast cast5 rc2 rc4 rc5 aes等




    OpenSSL命令---ciphers:

    用途:

    用来展示加密算法套件的工具。它能够把所有OpenSSL支持的加密算法按照一定规律排列(一般是加密强度)。

    用法:
    openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist]
    
    选项说明:
    
    -v:详细列出所有加密套件。包括SSL版本(SSLv2、SSLv3以及TLS)、密钥交换算法、身份验证算法、对称算法、摘要算法以及该算法是否允许出口。
    
    -ssl2:只列出sslv2使用的加密套件。
    
    -ssl3:只列出sslv3使用的加密套件。
    
    -tls1: 只列出tls使用的加密套件。
    
    cipherlist:列出一个cipher list的详细内容。此项能列出所有符合规则的加密套件,如果不加-v选项,它只会显示各个套件名称。

    使用实例:

    # openssl ciphers -h          //列出ciphers参数简要帮助

    # openssl ciphers -v -ssl2 

    # openssl ciphers -v -ssl3

    # openssl ciphers -v -tls1

    # openssl ciphers 'SHA1'     //列出所有使用SHA1算法的套件

    # openssl ciphers 'SSLv3'    //列出SSLv3所使用的算法

    # openssl ciphers 'SHA1+DES'  //列出所有包含SHA1和DES的套件

    # openssl ciphers -v 'ALL:eNULL' //详细列出所有非加密算法

    # openssl ciphers -v 'ALL:!ADH:@STRENGTH' //列出所有不包含匿名DH的算法并排序

    # openssl ciphers -v '3DES:+RSA' //仅列出包含3DES和RSA算法的套件且将包含RSA的显示在底部

    OpenSSL命令---genrsa:

    用途:

    用来产生RSA私钥。

    用法:
    openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand   file(s)] [-engine id] [numbits]
    
    选项说明:
    
    -out fiename: 指定输出文件。如果没有设定此选项,将会输出到标准输出。
    
    -passout arg: 指定密码来源。
    
    -des|-des3|-idea:用来加密私钥文件的三种对称加密算法。
    
    -F4|-3:指定指数。-f4为0x1001  
    
    -rand file(s):指定随机种子。

      -text——打印私钥和公钥和参数(PEM或DER结构)的(未加密)文本。

    -engine id:硬件引擎。
    
    numbits:  生成的密钥位数。必须是本指令的最后一个参数。默认为512bits。

    OpenSSL命令---pkey:

    用途:

    pkey命令处理公钥或私钥。它们可以在各种形式之间进行转换,并将其结构打印出来。

    语法:
    openssl pkey [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]   [-passout arg] [-cipher] [-text] [-text_pub] [-noout] [-pubin] [-pubout] [-engine id]
    
    -inform PEM|DER—— 输入格式
    -outform PEM|DER—— 输出格式
    -in filename——输入密钥文件,如果未指定此选项,则从标准输入读取。如果密钥加密,将提示输入密码。
    -passin arg—— 输入密钥的密码
    -out filename——输出文件, 如果未指定此选项,则输出到标准输出。如果设置了任何加密选项,则会提示输入密码。输出文件名不能与输入文件名相同
    -passout arg 输出密钥的加密口令
    -cipher—— 输出密钥的加密方式
    -text—— 除了编码版本之外,以明文形式打印各种公共或私人密钥。
    -text_pub——只打印公钥,当一个私钥在处理时
    -noout—— 不输出密钥的编码版本
    -pubin——默认是读入私钥,该选项指定读入公钥
    -pubout—— 默认情况下会输出私钥:使用此选项将会输出公钥。 如果输入是公钥,则会自动设置此选项。用于从私钥生成公钥。
    -engine id——引擎id
    
    
    使用实例;
    //由私钥生成公钥
    $openssl pkey  -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pub.key -outform PEM     -pubout -text
    //私钥改密码
    $openssl pkey  -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_change.key -outform PEM -passout pass:456789 -des-cbc  -text
    //改变公钥格式
    $openssl pkey  -in rsa_pub.key -inform PEM -out rsa_pub_der.key -outform DER -pubin -pubout -text

    OpenSSL命令---req:

    用途:

    req命令主要创建证书请求(可以新生成私钥),查看证书请求。它可以创建自签名证书,以作为root CA使用。但不能读取证书

    语法:
    openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify][-modulus] [-new] [-rand file(s)] [-newkey arg]  [-nodes] [-key filename]  [-keyform PEM|DER] [-keyout filename][-keygen_engine id] [-[digest]] [-config filename] [-multivalue-rdn] [-x509] [-days n] [-set_serial n] [-asn1-kludge] [-no-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id]
    
    输入输出项,通用选项
    -inform PEM|DER——输入的证书请求的格式。 DER选项使用与PKCS#10兼容的ASN1 DER编码格式。 PEM格式是默认格式:它由DER格式base64编码,带有附加的头部和尾部。
    -outform PEM|DER——输出的证书或证书请求的格式,默认PEM
    -in filename——输入的证书请求文件名,如果未指定此选项,则从标准输入。只有未指定选项-new和-newkey)时,才会读取证书请求
    -out filename——输出证书或证书请求文件名,不指定则默认标准输出
    -[digest]——指定消息摘要算法(如-md5,-sha1)来对证书请求签名。这将覆盖配置文件中指定的摘要算法。 * 一些公钥算法可以忽略这个选项*。例如,DSA签名始终使用SHA1,GOST R 34.10签名始终使用GOST R 34.11-94(-md_gost94)。
    -config filename——使用的config文件的名称。本选项如果没有设置,将使用缺省的config文件
    私钥选项
    -key filename—— 指定从中读取私钥的文件。它也读取PEM格式的PKCS#8私钥
    -keyform PEM|DER——在-key参数中指定的读入的私钥文件的格式。默认 PEM
    -passin arg——私钥的口令
    -keyout filename—— 指定新创建的私钥的输出文件名字。如果未指定此选项,则使用配置文件中的文件名。只能以PEM格式输出
    -passout arg——新建的私钥口令
    -rand file(s)——指定随机数种子文件,或者EGD套接字的随机数据的文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”
    -nodes——如果指定了此选项,创建私钥时则不会对其进行加密
    -keygen_engine id——生成私钥的引擎
    -pkeyopt opt:value 设置公钥算法选项选择值。genpkey手册页中的密钥生成选项。
    -newkey arg——用于生成新的私钥以及证书请求。arg 可以是下列:
    rsa:nbits——其中nbits是比特数,指明生成一个RSA密钥的长度。如果省略nbits,如:-newkey rsa,则使用配置文件中指定的默认密钥长度。
    alg:file——所有其他算法都支持-newkey alg:filename,其中文件可能是由genpkey -genparam命令创建的算法参数文件或于具有适用于alg算法的密钥的X.509证书。
    param:file —— 用参数文件或证书文件生成一个密钥,算法由参数决定,
    algname:file—— 使用algname指定的算法和flle指定的参数生成密钥, 算法与参数必须匹配,algname指定代表所使用的算法,file可以省略,但必须用 -pkeyopt parameter指定参数。
    dsa:filename——使用文件filename中的参数生成DSA密钥。
    ec:filename——生成EC密钥(可用于ECDSA或ECDH算法),
    gost2001:filename——生成GOST R 34.10-2001密钥(需要在配置文件中配置ccgost引擎)。如果只指定gost2001,则应通过-pkeyopt paramset:X指定参数集
    证书请求选项
    -verify—— 验证证书请求上的签名。
    -new——本选项产生一个新的证书请求,它会要用户输入创建证书请求的一些必须的信息。至于需要哪些信息,是在config文件里面定义好了的。如果-key没有被设置,,那么就将根据config文件里的信息先产生一对新的RSA密钥值。
    -multivalue-rdn——当采用-subj arg选项时,允许多个值的rdn,比如arg参数写作:/CN=china/OU=test/O=abc/UID=123456+CN=forxy。如果不使用此选项,则UID值为123456+CN=forxy
    -asn1-kludge——缺省的req指令输出不带属性的完全符合PKCS10格式的证书请求,但有的CA仅仅接受一种非正常格式的证书请求,这个选项的设置就可以输出那种格式的证书请求。PKCS#10证书请求中的属性被定义为SET OF属性。 它们不是可选的,因此如果没有属性存在,那么它们应该被编码为空的SET OF。 而非正常格式的证书请求中不包括空的SET OF。 应该注意的是,很少的CA仍然需要使用这个选项。
    -no-asn1-kludge——不输出特定格式的证书请求。
    -newhdr——在CSR问的第一行和最后一行中加一个单词”NEW”,有的软件(netscape certificate server)和有的CA就有这样子的怪癖嗜好。如果那些必须要的选项的参数没有在命令行给出,那么就会到config文件里去查看是否有缺省值
    -extensions section -reqexts section——这俩个选项指定config文件里面的与证书扩展和证书请求扩展有关的俩个section的名字(如果-x509这个选项被设置)。这样你可以在config文件里弄几个不同的与证书扩展有关的section,然后为了不同的目的给证书请求签名的时候指明不同的section来控制签名的行为。。
    -utf8—— 此选项将字段值解释为UTF8字符串,默认情况下将其解释为ASCII。这意味着字段值(无论是从终端提示还是从配置文件获取)必须是有效的UTF8字符串。
    -subj arg——用于指定生成的证书请求的用户信息,或者处理证书请求时用指定参数替换。生成证书请求时,如果不指定此选项,程序会提示用户来输入各个用户信息,包括国名、组织等信息,如果采用此选择,则不需要用户输入了。比如:-subj /CN=china/OU=test/O=abc/CN=forxy,注意这里等属性必须大写。
    -batch——不询问用户任何信息(私钥口令除外),采用此选项生成证书请求时,不询问证书请求当各种信息
    -verbose—— 打印关于执行操作的额外的详细信息
    -engine id——引擎
    证书签名
    
    -x509—— 此选项输出自签名证书。这通常用于生成测试证书或自签名根证书。添加到证书的扩展项(如果有)在配置文件中指定。除非使用set_serial选项,否则将使用较大的随机数作为序列号。
    -days n—— 当使用-x509选项时,指定证书的有效期。默认为30天。
    -set_serial n—— 输出自签名证书时使用的序列号。如果前缀为0x,则可以将其指定为十进制值或十六进制值。可以使用负序列号,但不建议这样做。
    显示选项
    
    -text—— 以文本形式打印证书请求
    -pubkey—— 输出公钥。
    -noout——选项可防止输出证书请求的编码版本
    -modulus—— 该选项打印证书请求中公钥的模数值
    -subject—— 打印证书请求的subject
    -nameopt——用于确定主题或发行者名称的显示方式。选项参数可以是单个选项或多个选项,以逗号分隔。-nameopt开关可以被多次使用以设置多个选项。参见X509。
    -reqopt—— 定制与-text一起使用时的输出格式。选项参数可以是单个选项或多个选项,以逗号分隔。 请参阅x509命令中-certopt参数的说明。
    配置文件格式
    配置选项在配置文件的req部分中指定。与所有配置文件一样,如果在特定部分(即req)中未指定任何值,则使用默认值。
    input_password output_password ——输入私钥文件(如果存在)和输出私钥文件(如果将被创建)的口令。命令行选项passin和passout覆盖此值。
    default_bits—— 指定默认密钥大小(以位为单位)。 此选项与-new选项结合使用以生成新密钥。可以通过在-newkey选项中指定密钥大小来覆盖它。最小的接受密钥大小是512位。如果没有指定密钥大小,则使用2048位。
    default_keyfile—— 这是将私钥输出时的默认文件名。如果未指定,则将该键写入标准输出。这可以被-keyout选项覆盖。
    oid_file——指定一个包含其他对象标识符的文件。文件的每一行都应包含对象标识符的数字形式,后跟空格,然后是短名称,后跟空格,最后是长名称。。
    oid_section——指定配置文件中包含额外对象标识符的部分。每一行都应包含对象标识符的短名称,后面跟着=和数字形式。当使用此选项时,短名称和长名称相同。
    RANDFILE—— 这指定了放置和读取随机数种子信息或EGD套接字的文件名(请参阅RAND_egd)。它用于私钥生成。
    encrypt_key——如果这被设置为否,则如果生成私钥,则不加密。这相当于-nodes命令行选项。为了兼容性,encrypt_rsa_key是一个等效的选项。
    default_md——此选项指定要使用的摘要算法。可能的值包括md5 sha1 mdc2。如果不存在,则使用MD5。该选项可以在命令行中被覆盖。
    string_mask—— 此选项会遮蔽某些字段中某些字符串类型的使用。大多数用户不需要更改此选项。它可以设置默认值,默认选项使用PrintableStrings,T61Strings和BMPStrings,如果设置为pkix,则只能使用PrintableStrings和BMPStrings。这符合RFC2459中的PKIX建议。如果设置utf8only,则仅使用UTF8Strings:这是2003年之后的RFC2459中的PKIX建议。最后,设置为nombstr仅使用PrintableStrings和T61Strings:某些软件在BMPStrings和UTF8Strings中有问题:特别是Netscape。
    req_extensions——它指定了配置文件中字节包含了一系列的额外信息,这些额外信息将会被添加到证书请求信息中。它可以被-reqexts命令覆盖。有关详细信息,请参阅x509v3_config(5)。
    x509_extensions 它指定了配置文件中字节包含了一系列的扩展信息,当-x509选项使用时,这些额外信息将会被添加到证书中。它可以被- extensions命令行所覆盖。
    prompt——如果设置为值no,则禁用提示字段,并直接从配置文件获取值。它还会更改distinguished_name和attributes部分的预期格式。
    utf8—— 如果设置为yes,则域的值将转换为utf8格式。默认的是ASCII格式。这就意味着这些域值不能从终端获取值,只能从配置文件中获取,还必须是可利用的UTF8字符串。
    attributes——这个指定了包含很多请求属性的字节:格式和distinguished_name一样。具有代表性的是包含challengePassword 或 unstructuredName 类型。目前来说,他们是被OpenSSL的请求签名实体所忽略了的,但是一些CA有可能需要他们。
    distinguished_name——这个指定了包含distinguished_name域,当产生一个证书或证书请求时,有提示。
    注意:PEM格式的页眉和页脚线通常为:
        —–BEGIN CERTIFICATE REQUEST—–
        —–END CERTIFICATE REQUEST—–
      某些软件(某些版本的Netscape证书服务器)需要:
    —–BEGIN NEW CERTIFICATE REQUEST—–
    —–END NEW CERTIFICATE REQUEST—–
      它使用-newhdr选项生成,但以其他方式兼容。 任何形式的输入都被透明地接受。
      Xenroll与MSIE生成的证书请求已添加扩展名。 它包括keyUsage扩展,它决定了密钥的类型(仅限签名或通用目的)以及脚本在extendedKeyUsage扩展中输入的任何其他OID。
    distinguished_name和 attributes格式  
    有两种单独的格式。如果 prompt选项设置为否,则这些部分仅由字段名称和值组成, 这允许外部程序(例如基于GUI)生成具有所有字段名称和值的模板文件,并将其传递给req:例如,
    CN=My Name
    OU=My Organization
    emailAddress=someone@somewhere.org
    或者,如果提示选项不存在或未设置为否,则该文件包含字段提示信息。它由以下形式组成:
       fieldName=”prompt”
       fieldName_default=”default field value”
       fieldName_min= 2
       fieldName_max= 4
    ”fieldName”是正在使用的字段名称,例如commonName(或CN)。 “提示”字符串用于要求用户输入相关详细信息。如果用户没有输入任何内容,那么如果没有默认值,则使用默认值,r如果没有默认值则省略该字段。如果用户刚刚输入’.’,即使存在默认值,仍然可以省略一个字段。
    输入的字符数必须在fieldName_min和fieldName_max限制之间:根据正在使用的字段可能会有其他限制(例如,countryName只能长两个字符,并且必须适合PrintableString)。
    某些字段(如organizationName)可以在DN中多次使用。 这是一个问题,因为配置文件将不会识别出现两次相同的名称。 为了避免这个问题,如果fieldName包含一些字符后跟一个完整的停止将被忽略。 所以第二个organizationName可以通过调用“1.organizationName”来输入。
    实际上所许可的域名字是一些对象标识符的短或长名字。它们在OpenSSL中编译和包含常用的值例如as commonName、countryName、localityName、 organizationName、organizationUnitName、stateOrProvinceName。此外emailAddress也包含name、 surname、givenName initials 和 dnQualifier。
    可以使用配置文件中的oid_file或oid_section选项来定义附加对象标识符。 任何其他字段将被视为一个DirectoryString。
    使用实例:

    //验证证书请求
    $openssl req -verify -in root.req -text -noout -pubkey -modulus -subject

    //创建一个私钥,并用其生成一个证书请求
    $openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc
    -algorithm RSA -pkeyopt rsa_keygen_bits:1024

    $openssl req -new -key rsa_pri.key -inform PEM -passin pass:123456 -out root.req -subj
    /CN=china/OU=test/O=abc/CN=forxy

    //等效于
    $ openssl req -newkey rsa:1024 -keyout new_rsa_pri.key -outform PEM -passout pass:123456 -out root.req -subj /CN=china/OU=test/O=abc/CN=forxy

    //产生一个自签名的根证书,不提供私钥
    $openssl req -x509 -set_serial 10001 -days 10 -subj /CN=china -newkey rsa:1024 -keyout new_rsa_pri.pkey -outform PEM -passout pass:123456 -out root_new.cer -outform PEM

    //产生一个自签名的根证书,提供私钥
    $openssl req -x509 -set_serial 10001 -days 10 -key rsa_pri.pem -keyform PEM -passin pass:123456 -in root.req -inform PEM -out root.cer -outform PEM

    //oid_file选项指定的文件
    1.2.3.4 shortName A longer Name
    1.2.3.6 otherName Other longer Name

    //oid_section指定的文件
    testoid1=1.2.3.5
    testoid2=${testoid1}.6

    //带提示的配置文件
    [ req ]
    default_bits = 2048
    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 = 2048
    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

    
    

    OpenSSL命令---X509:

    用途:

    本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换证书格式,给证书请求签名,也可自签根证书等等。由于功能太多,我们按功能分成几部分来讲。

    语法:

    openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM] 
    [-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename] [-out filename][-serial] [-hash]   
    [-subject_hash] [-issuer_hash] [-ocspid] [-subject] [-issuer] [-nameopt option] 
    [-modulus] [-pubkey] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust] 
    [-clrreject] [-addtrust arg][-addreject arg] [-setalias arg] [-days arg] [-set_serial n] 
    [-signkey filename] [-passin arg] [-x509toreq] [-req] [-CA filename] [-CAkey filename] 
    [-CAcreateserial] [-CAserial filename] [-force_pubkey key] [-text] [-certopt option] 
    [-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section]
    [-engine id]
    输入,输出和一般用途选项
    -inform DER | PEM | NET— X509证书或证书请求的输入格式, DER格式是证书的DER编码,PEM是添加了头部和尾部的DER编码的base64编码。 NET选项是一个晦涩的Netscape服务器格式,现在已经过时了。
    -outform DER | PEM | NET——输出格式,这些选项与-inform选项具有相同的含义。
    in filename——如果未指定此选项,则从标准输入读取。
    -out文件名——默认情况下,它指定要写入的输出文件名或标准输出。
    -md2 | -md5 | -sha1 | -mdc2—— 摘要算法。 这会影响使用消息摘要的任何签名或显示选项,例如-fingerprint,-signkey和-CA选项。 如果未指定,则使用SHA1。 如果用于登录的密钥是DSA密钥,则此选项不起作用:SHA1始终与DSA密钥一起使用。
    -engine id—— 指定引擎。
    显示选项
    注意:-alias和-purpose选项也是显示选项,但在解释在“信任设置”部分。
    -text—— 以文本形式打印证书。输出全部细节,包括公钥,签名算法,发行人和主题名称,任何扩展名的序列号和任何信任设置。
    -certopt——定制与-text一起使用的输出格式。选项参数可以是单个选项或多个选项,以逗号分隔。可以使用-certopt开关多次设置多个选项。有关详细信息,请参阅文本选项部分。
    -noout——此选项可防止输出编码版本信息。
    -pubkey——以PEM格式输出证书的SubjectPublicKeyInfo。
    -modulus——此选项打印证书中公钥的模数值。
    -serial——输出证书序列号。
    -subject_hash——输出证书主题名称的“哈希”。这在OpenSSL中用于形成索引,以允许按主题名称查找目录中的证书。
    -issuer_hash——输出证书颁发者名称的“哈希”。
    -ocspid——输出主题名称和公钥的OCSP哈希值。
    -hash——“-subject_hash”的同义词,用于向后兼容性。
    -subject_hash_old——使用OpenSSL版本1.0.0之前使用的旧算法输出证书主题名称的“散列”。
    -issuer_hash_old—— 使用OpenSSL版本1.0.0之前使用的旧算法输出证书颁发者名称的“哈希”。
    -subject——输出证书的主题。
    -issuer——输出颁发者名称。
    -nameopt option——用于确定主题或发行者名称的显示方式。选项参数可以是单个选项或多个选项,以逗号分隔。-nameopt可以被多次使用以设置多个选项。有关详细信息,请参阅“NAME OPTIONS”部分。
    -email——输出电子邮件地址(如果有)。
    -ocsp_uri——输出OCSP响应者地址(如果有)。
    -startdate——打印证书的开始日期,即notBefore日期。
    -enddate——打印证书的到期日期,即notAfter日期。
    -dates——打印证书的开始和到期日期。
    -checkend arg——检查证书是否在下一个arg秒内到期,如果是,则返回非零,否则为零。
    -fingerprint——打印整个证书的DER编码版本的摘要(请参阅摘要选项)。
    -C——这将以C源文件的形式输出证书。
    可信设置——请注意,这些选项目前是实验性的,可能会有所改变。
    受信任的证书是普通证书,其中附有数个附加的信息,例如证书的许可和禁止使用以及“别名”。通常当证书被验证时,至少有一个证书必须是“可信任的”。默认情况下,受信任的证书必须在本地存储,并且必须是根CA:任何以CA结尾的证书链可用于任何目的。目前的信任设置仅与根CA一起使用。它们允许对根CA可以使用的目的进行更精细的控制。例如,CA可能被信任为SSL客户端,但不能使用SSL服务器。 有关信任设置的含义的更多信息,请参阅verify实用程序的说明。未来版本的OpenSSL将会识别任何证书上的信任设置,不仅仅是根CA。
    -trustout——使x509输出可信证书。可以输入普通或可信任的证书,但默认情况下会输出普通证书,并丢弃任何信任设置。使用-trustout选项,输出可信证书。如果任何信任设置被修改,将自动输出受信任的证书。
    -setalias arg—— 设置证书的别名。 这将允许使用昵称来引用证书,例如“Steve’s Certificate”。
    -alias——输出证书别名(如果有)。
    -clrtrust——清除证书附加项里所有有关用途允许的内容。
    -clrreject——清除证书附加项里所有有关用途禁止的内容。
    -addtrust arg——添加证书附加项里所有有关用途允许的内容。
    -addreject arg——添加证书附加项里所有有关用途禁止的内容。
    -purpose——打印出证书附加项里所有有关用途允许和用途禁止的内容。
    签名选项—— x509实用程序可用于签署证书请求:因此它可以像“迷你CA”一样运行。
    -signkey filename——私钥文件。 如果输入文件是证书,则将颁发者设置为其主题名称(即使其自签名)将公钥更改为提供的值,并更改开始和结束日期。开始日期设置为当前时间,结束日期设置为由-days选项确定的值。除非提供了-clrext选项,否则将保留任何证书扩展名。如果输入是证书请求,则使用提供的私钥按照证书请求中的subject创建自签名证书。(主要用于自签名,与req程序中的-x509一样)
    -passin arg—— 私钥口令。有关arg的格式的更多信息
    -clrext——从证书中删除任何扩展项。当从另一个证书创建证书时使用此选项(例如使用-signkey或-CA选项)。通常所有的扩展都保留。
    -keyform PEM | DER——指定-signkey选项中使用的私钥文件的格式(DER或PEM)。
    -days arg—— 指定使证书有效的天数。默认为30天。
    -x509toreq——将证书转换为证书请求。 -signkey选项用于传递所需的私钥。
    -req——默认-in输入证书。使用此选项表示输入的是证书请求。
    -set_serial n——指定要使用的序列号。此选项可与-signkey或-CA选项一起使用。如果与-CA选项结合使用,则不使用序列号文件(由-CAserial或-CAcreateserial选项指定)。 序列号可以是十进制或十六进制(如果前面是0x)。也可以指定负序列号,但不建议使用它们。
    -CA filename——指定要用于签名的CA证书。当此选项存在时,x509的行为就像“迷你CA”。该CA使用此选项对输入文件进行签名:将其颁发者名称设置为CA的主题名称,并使用CAs私钥进行数字签名。此选项通常与-req选项组合。没有-req选项,输入是必须是自签名的证书。
    -CAform PEM|DER ——指定CA证书的格式
    -CAkey filename——设置CA私钥以签署证书。如果未指定此选项,则假定CA私钥存在于CA证书文件中。
    -CAkeyform PEM|DER——指定CA私钥的格式
    -CAserial filename——设置要使用的CA序列号文件,当-CA选项用于签署证书时,它使用文件中指定的序列号。该文件包含一行偶数个十六进制数字。每次使用后,序列号将增加并再次写入文件。默认文件名由附加了“.srl”的CA证书文件基础名称组成。例如,如果CA证书文件被称为“mycacert.pem”,则它希望找到一个名为“mycacert.srl”的序列号文件。
    -CAcreateserial——使用此选项,当CA序列号文件不存在时将被创建:它将包含序列号“02”,正在签名的证书将具有1作为其序列号。通常如果指定了-CA选项并且序列号文件不存在,则会出现错误。
    -extfile filename—— 指定包含证书扩展项的文件名。如果没有,那么生成的证书将没有任何扩展项。
    -extensions section——指定要添加证书扩展项的section。 如果未指定此选项,则扩展名应包含在未命名(默认)部分中,默认部分应包含一个名为“extensions”的变量,该变量包含要使用的部分。 有关扩展部分格式的详细信息,请参阅x509v3_config手册页。
    -force_pubkey key—— 当创建证书时,将其公钥设置为密钥而不是证书或证书请求中的密钥。 此选项对于创建证书,在算法无法正常签署请求时很有用,例如DH。 可以使用-keyform选项指定公钥格式。
    名称选项——nameopt选项确定主题和发行者的显示方式。如果没有nameopt开关,则使用与以前兼容的默认“oneline”格式。OpenSSL版本。每个选项在下面详细描述,所有选项都可以在前面加a -来关闭该选项。通常只会使用前四个。
    compat——使用旧格式。这相当于没有指定任何名称选项。
    RFC2253——相当于使用esc2253,esc_ctrl,esc_msb,utf8,dump_nostr,dump_unknown,dump_der,sep_comma_plus,dn_rev和sname 参数
    oneline——一种比RFC2253更可读的一行格式。相当于指定esc_2253,esc_ctrl,esc_msb,utf8,dump_nostr,dump_der,use_quote,sep_comma_plus_space,space_eq和sname选项。
    multiline—— 多行格式。它等效于esc_ctrl,esc_msb,sep_multiline,space_eq,lname和align。
    esc_2253——在字符串中转义RFC2253所需的“特殊”字符,即+“<>;另外,在字符串的开头的#和字符串开头或结尾处的空格字符也要进行转义。
    esc_ctrl ——转义控制字符。ASCII值小于0x20(空格)的字符和delete(0x7f)字符。它们使用RFC2253 中的 XX符号进行转义(其中XX是表示字符值的两个十六进制数字)
    esc_msb——转义MSB集合字符,即ASCII值大于127。
    use_quote—— 通过以引号围绕整个字符串转义一些字符,没有选项时,所有的转义都是用字符完成的。
    utf8——首先将所有字符串转换为UTF8格式。这是RFC2253所要求的。如果您有UTF8兼容终端,则使用此选项(而不是设置esc_msb)可能会让多字节(国际)字符的正确显示。此选项不存在,则大于0xff的多字节字符将使用格式 UXXXX(16位)和 WXXXXXXXX(32位)来表示。此外,如果此选项关闭,任何UTF8Strings将首先转换为其字符形式。
    ignore_type——此选项不会以任何方式尝试解释多字节字符。这就是他们的内容八位字节只是被转储,就像一个八位位组代表每个字符一样。这对于诊断目的是有用的,但会导致相当奇怪的输出。
    show_type——显示ASN1字符串的类型。该类型位于字段内容之前。例如“BMPSTRING:Hello World”。
    dump_der——当设置此选项时,需要使用hexdumped的任何字段将使用字段的DER编码进行转储。否则只会显示内容八位字节。两种选项都使用RFC2253 #XXXX …格式。
    dump_nostr——转储非字符串类型(例如OCTET STRING),如果未设置此选项,则将显示非字符串类型,因为每个内容字节表示单个字符。
    dump_all——转储所有字段。当与dump_der一起使用时,该选项允许明确地确定结构的DER编码。
    dump_unknown——转储OpenSSL无法识别OID的任何字段。
    sep_comma_plus, sep_comma_plus_space, sep_semi_plus_space, sep_multiline—— 这些选项决定了字段分隔符。第一个字符在RDN之间,而第二个是多个AVA之间(多个AVA非常罕见,并且不鼓励使用它们)。以“空格”结尾的选项还会在分隔符之后放置一个空格,使其更易于阅读。 sep_multiline对RDN分隔符使用换行字符,并为AVA分隔符使用间隔的+。它还将字段缩小四个字符。如果没有指定字段分隔符,则默认使用sep_comma_plus_space。
    dn_rev——反转DN的字段。 这是RFC2253所要求的。 作为副作用,这也反转了多个AVA的顺序,但这是允许的。
    nofname,sname,lname,oid—— 这些选项会改变字段名称的显示方式。
    nofname根本不显示字段。
    sname使用“短名称”表单(例如,用于commonName的CN)。
    lname使用长格式。
    oid以数字形式表示OID,可用于诊断目的。
    align——调整字段值以获得更可读的输出。 仅适用于sep_multiline。
    space_eq——在字段名后面的=字符上放置空格。
    文本选项 ——除了自定义name输出格式,还可以在文本选项存在时自定义使用certopt选项打印的实际字段。默认行为是打印所有字段
    compatible—— 使用旧格式。这相当于完​​全没有指定输出选项。
    no_header——不要打印头信息:只打印“证书”和“数据”的行。
    no_version——不要打印出版本号。
    no_serial——不要打印出序列号。
    no_signame——不打印出使用的签名算法。
    no_validity—— 不打印有效日期,那就是notBefore和notAfter字段
    no_subject——不打印主题名称
    no_issuer——不要打印出颁发者
    no_pubkey—— 不要打印出公钥
    no_sigdump——不要给出证书签名的十六进制dump
    no_aux—— 不要打印证书信任信息
    no_extensions——不要打印任何X509V3扩展。
    ext_default—— 保留默认扩展行为:尝试打印不支持的证书扩展名
    ext_error——打印不支持的证书扩展的错误消息
    ext_parse—— ASN1解析不受支持的扩展
    ext_dump—— 十六进制转储不支持扩展
    ca_default—— ca实​​用程序使用的值,相当于no_issuer,no_pubkey,no_header,no_version,no_sigdump和no_signame。
    注意
    PEM格式使用头部和尾部:
    —–BEGIN CERTIFICATE—–
    —–END CERTIFICATE—–
    它还将处理包含的文件:
    —–BEGIN X509 CERTIFICATE—–
    —–END X509 CERTIFICATE—–
    可信任的证书有以下行:
    —–BEGIN TRUSTED CERTIFICATE—–
    —–END TRUSTED CERTIFICATE—–
    使用nameopt选项转为UTF8格式的假定T61Strings使用ISO8859-1字符集。 虽然这是错误的,但Netscape和MSIE都是做许多证书。 所以尽管这是不正确的,但更有可能正确显示大多数证书。
    -fingerprint选项使用DER编码证书的摘要。 这通常被称为“指纹”。 由于消息摘要的性质,证书的指纹对于该证书是唯一的,并且具有相同指纹的两个证书可以被认为是相同的。
    Netscape指纹使用MD5,而MSIE使用SHA1。
    -email选项搜索主题名称和主题备用名称扩展名。 只会打印出唯一的电子邮件地址:它不会多次打印相同的地址。
    证书扩展项
    -purpose选项检查证书扩展项,并确定可以使用的扩展项。完成的实际检查相当复杂,包括处理破坏的证书和软件的各种黑客和解决方法。在证书链中,当验证不信任的证书也将使用同样的代码。因为这个字段对验证代码已经拒绝了的证书链来说非常有用。
    basicConstraints扩展CA标志用于确定证书是否可以用作CA。如果CA标志为真,那么它是CA,如果CA标志为false,那么它不是CA。所有CA应该将CA标志设置为true。 如果basicConstraints扩展名不存在,则证书被认为是“可能的CA”,根据证书的预期用途检查其他扩展项。在这种情况下会发出警告,因为证书实际上不应被视为CA:但是它被允许作为CA来解决一些破坏的软件。如果证书是V1证书(因此没有扩展名),并且它是自签名的,它也被认为是CA,但是再次给出警告:这是为了解决Verisign根的问题,这是V1自签名证书。 如果keyUsage扩展项存在,则对证书的使用作出额外限制。如果存在keyUsage扩展项,CA证书必须设置keyCertSign位。如果扩展密钥用法存在,则附加的约束将会作用到该证书上。如果扩展密钥用法存在,密钥仅仅能够用于指定的证书用途。 以下给出了每个测试的完整描述。关于basicConstraints和keyUsage和V1证书的注释适用于所有CA证书。
    SSL Client ——扩展密钥用法必须不存在或包含“web client authentication”OID值。密钥用法必须不存在或者必须要设置digitalSignature字节。Netscape类型必须不存在或者必须要设置SSL Client字节。
    SSL Client CA—— 扩展密钥用法扩展项必须不存在,或包括“Web客户端认证”OID。 Netscape证书类型必须不存在,或者必须设置SSL CA位:如果basicConstraints扩展名不存在,则将其用作一个工作。
    SSL Server——扩展密钥用法必须不存在或包含“web server authentication”OID值。密钥用法必须不存在或者必须有digitalSignature,keyEncipherment设置或者两者都要设置。Netscape类型必须不存在或者必须要设置SSL Server字节。
    SSL Server CA——扩展密钥用法必须不存在或包含“web server authentication”OID值。Netscape类型必须不存在或者必须要设置SSL Server字节:如果basicConstraints额外信息不存在,它将会使用。
    Netscape SSL Server如果密钥用法存在,Netscape格式的SSL 客户端必须要有keyEncipherment字节被设置后才能连接到服务器。这个选项不是有效的因为一些算法套件要用密钥进行数字签名。要不然就和普通的SSL Server一样。
    Common S/MIME Client Tests——扩展密钥用法必须不存在或包含“email protection”OID值。Netscape类型必须不存在或者必须要设置S/MIME字节。如果在Netscape 格式证书中,S/MIME字节没有被设置,SSL client字节将会默许作为一个可供选择。但是一个警告将会显示:这是因为一些证书没有设置S/MIME字节。
    S/MIME Signing——如果该扩展密钥用法存在,则普通的S/MIME客户端必须设置digitalSignature字节。
    S/MIME Encryption——如果该扩展密钥用法存在,则普通的S/MIME客户端必须设置keyEncipherment字节。
    S/MIME CA——扩展密钥用法必须不存在或包含“email protection”OID值。Netscape类型必须不存在或者必须要设置S/MIME CA字节:如果basicConstraints额外信息不存在,它将会使用。
    CRL Signing——扩展密钥用法必须不存在或或者必须要设置CRL signing字节。
    CRL Signing CA——普通CA测试申请。
    BUGs:
    证书中的扩展不会转发到证书请求中,反之亦然。
    在某些情况下,有可能通过指定错误的私钥或使用不一致的选项来生成无效的证书或请求:应该检查这些证书或请求。
    应该有明确设置开始和结束日期的选项,而不是与当前时间的偏移。
    目前正在开发实施TRUST SETTINGS中描述的验证行为的代码。 因此,它描述了预期的行为,而不是当前的行为。 希望它在OpenSSL 0.9.5及更高版本中代表现实。

    使用实例:

    //自签证书
    $openssl x509 -req -signkey rsa_pri.key -keyform PEM -passin pass:123456 -in root.req -inform PEM -out root.cer -outform PEM
    
    //签发用户证书
    $openssl x509 -req -set_serial 00001 -days 100  -CA root.cer -CAform PEM -CAkey rsa_pri.key -CAkeyform PEM -passin pass:123456 -in user.req -inform PEM -out user.cer -outform PEM 
    
    //解析证书完整信息
    $openssl x509 -in user.cer -inform PEM -text -noout
    
    //查看证书指定信息
    $openssl x509 -in user.cer -inform PEM  -noout -pubkey -modulus -serial -subject -issuer -email -startdate -enddate -dates -fingerprint  -subject_hash -issuer_hash -subject_hash_old -issuer_hash_old
    
    //以C源码输出证书
    $openssl x509 -in user.cer -inform PEM -out user.infor -C 
    
    //转换证书格式
    $openssl x509 -in user.cer -inform PEM -out user.der -outform DER
    //查看证书用途
    $openssl x509 -purpose -noout -in user.cer
  • 相关阅读:
    Java基础教程——Object类
    Java之从头开始编写简单课程信息管理系统
    动手动脑之文件流
    doc四则运算
    Java异常处理的方法
    动手动脑-异常处理
    动手动脑-Java的继承与多态
    跟踪某个类中创建对象的个数
    动手动脑--类与对象
    动手动脑
  • 原文地址:https://www.cnblogs.com/gavin11/p/14302045.html
Copyright © 2011-2022 走看看