RSA分组模式

965 阅读24分钟

分组加密的四种模式(ECB、CBC、CFB、OFB)

加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。 对称加密又分为分组加密和序列密码。 分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。 序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。 解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。

分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。

1)ECB(Electronic Code Book)/电码本模式

DES ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

特点:

1.简单,有利于并行计算,误差不会被传送; 2.不能隐藏明文的模式; repetitions in message may show in cipher text/在密文中出现明文消息的重复 3.可能对明文进行主动攻击; 加密消息块相互独立成为被攻击的弱点/weakness due to encrypted message blocks being independent

2)CBC(Cipher Block Chaining)/密文分组链接方式

DES CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:

加密步骤如下:

1)首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)

2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)

3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2

4)之后的数据以此类推,得到Cn

5)按顺序连为C1C2C3......Cn即为加密结果。

解密是加密的逆过程,步骤如下:

1)首先将数据按照8个字节一组进行分组得到C1C2C3......Cn

2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)

3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2

4)之后依此类推,得到Dn

5)按顺序连为D1D2D3......Dn即为解密结果。

这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。

特点: 1、不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。 each ciphertext block depends on all message blocks/每个密文块依赖于所有的信息块 thus a change in the message affects all ciphertext blocks/明文消息中一个改变会影响所有密文块

  1. need Initial Vector (IV) known to sender & receiver/发送方和接收方都需要知道初始化向量
  2. 加密过程是串行的,无法被并行化(在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化)。

3)Cipher Feedback (CFB)/密文反馈模式

密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程: 需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。 与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。

4)Output Feedback (OFB)/输出反馈模式

输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。 每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。 可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。

openssl数字证书常见格式与协议介绍

证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSRCRTCRL 、OCSP、SCEP等。

PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:

  1. 内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
  2. 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
  3. 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。

使用PEM格式存储的证书: —–BEGIN CERTIFICATE—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ……… 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END CERTIFICATE—– 使用PEM格式存储的私钥: —–BEGIN RSA PRIVATE KEY—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ……… 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END RSA PRIVATE KEY—– 使用PEM格式存储的证书请求文件: —–BEGIN CERTIFICATE REQUEST—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ……… 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END CERTIFICATE REQUEST—–

DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。 PFX 或 P12 – 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件。转换时需要输入PFX文件的加密密码。 JKS – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式”转换为标准的Java Key Store(JKS)文件。JKS文件格式被广泛的应用在基于JAVA的WEB服务器、应用服务器、中间件。你可以将JKS文件导入到TOMCAT、 WEBLOGIC 等软件。 KDB – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式转换为标准的IBM KDB文件。KDB文件格式被广泛的应用在IBM的WEB服务器、应用服务器、中间件。你可以将KDB文件导入到IBM HTTP Server、IBM Websphere 等软件。 CSR - 证书请求文件(Certificate Signing Request)。生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):

  1. 用户生成自己的公私钥对;
  2. 构造自己的证书申请文件,符合 PKCS#10 标准。该文件主要包括了用户信息、公钥以及一些可选的属性信息,并用自己的私钥给该内容签名;
  3. 用户将证书申请文件提交给 CA;
  4. CA 验证签名,提取用户信息,并加上其他信息(比如颁发者等信息),用 CA 的私钥签发数字证书;
  5. 说明:数字证书(如x.509)是将用户(或其他实体)身份与公钥绑定的信息载体。一个合法的数字证书不仅要符合 X509 格式规范,还必须有 CA 的签名。用户不仅有自己的数字证书,还必须有对应的私钥。X509v3 数字证书主要包含的内容有:证书版本、证书序列号、签名算法、颁发者信息、有效时间、持有者信息、公钥信息、颁发者 ID、持有者 ID 和扩展项。

OCSP – 在线证书状态协议(OCSP,Online Certificate Status Protocol,rfc2560)用于实时表明证书状态。OCSP 客户端通过查询 OCSP 服务来确定一个证书的状态,可以提供给使用者一个或多个数字证书的有效性资料,它建立一个可实时响应的机制,让用户可以实时确认每一张证书的有效性,解决由CRL引发的安全问题。。OCSP 可以通过 HTTP协议来实现。rfc2560 定义了 OCSP 客户端和服务端的消息格式。 CER - 一般指使用DER格式的证书。 CRT - 证书文件。可以是PEM格式。 KEY - 一般指PEM格式的私钥文件。 CRL - 证书吊销列表 (Certification Revocation List) 是一种包含撤销的证书列表的签名数据结构。CRL 是证书撤销状态的公布形式,CRL 就像信用卡的黑名单,用于公布某些数字证书不再有效。CRL 是一种离线的证书状态信息。它以一定的周期进行更新。CRL 可以分为完全 CRL和增量 CRL。在完全 CRL 中包含了所有的被撤销证书信息,增量 CRL 由一系列的 CRL 来表明被撤销的证书信息,它每次发布的 CRL 是对前面发布 CRL 的增量扩充。基本的 CRL 信息有:被撤销证书序列号、撤销时间、撤销原因、签名者以及 CRL 签名等信息。基于 CRL 的验证是一种不严格的证书认证。CRL 能证明在 CRL 中被撤销的证书是无效的。但是,它不能给出不在 CRL 中的证书的状态。如果执行严格的认证,需要采用在线方式进行认证,即 OCSP 认证。一般是由CA签名的一组电子文档,包括了被废除证书的唯一标识(证书序列号),CRL用来列出已经过期或废除的数字证书。它每隔一段时间就会更新,因此必须定期下载该清单,才会取得最新信息。 SCEP - 简单证书注册协议。基于文件的证书登记方式需要从您的本地计算机将文本文件复制和粘贴到证书发布中心,和从证书发布中心复制和粘贴到您的本地计算机。 SCEP可以自动处理这个过程但是CRLs仍然需要手工的在本地计算机和CA发布中心之间进行复制和粘贴。 PKCS7 – 加密消息语法(pkcs7),是各种消息存放的格式标准。这些消息包括:数据、签名数据、数字信封、签名数字信封、摘要数据和加密数据。 PKCS12 – pkcs12 (个人数字证书标准)用于存放用户证书、crl、用户私钥以及证书链。pkcs12 中的私钥是加密存放的。

如何使用OpenSSL工具生成根证书与应用证书

一、步骤简记

  1. // 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认)
  2. openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt
  3. // 为顶级CA的私钥文件去除保护口令
  4. openssl rsa -in CARoot1024.key -out CARoot1024.key
  5. // 生成顶级CA的公钥证书和私钥文件,有效期15年(RSA 2048bits,指定)
  6. openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CARoot2048.key -out CARoot2048.crt
  7. // 为顶级CA的私钥文件去除保护口令
  8. openssl rsa -in CARoot2048.key -out CARoot2048.key
  9. // 为应用证书/中级证书生成私钥文件
  10. openssl genrsa -out app.key 2048
  11. // 根据私钥文件,为应用证书/中级证书生成 csr 文件(证书请求文件)
  12. openssl req -new -key app.key -out app.csr
  13. // 使用CA的公私钥文件给 csr 文件签名,生成应用证书,有效期5年
  14. openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
  15. // 使用CA的公私钥文件给 csr 文件签名,生成中级证书,有效期5年
  16. openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything

以上是生成根证书与应用证书过程中要用到的所有命令,根据生成目标不同,分为三组。其中,前面两组都用于生成自签名的顶级CA(区别只在于密钥长度不同),实际应用中只需根据需求选择一组即可。

最后一组用于生成非自签名的证书,包括中级证书与应用证书。所谓中级证书,是具有继续颁发下级证书权限的子CA,而本文中所说的应用证书,特指不能用来继续颁发下级证书,只能用来证明个体身份的证书。顶级CA在签发二者的时候,只是多少一个 -extensions v3_ca 选项的区别,这个选项赋予被签发的证书继续签发下级证书的权力。

二、各步详解

2.1 生成自签名根证书(即顶级CA)

典型示例:openssl req -new-x509 -days5480 -keyoutCA.key -outCA.crt

[1] 命令选项和参数解读

示例中,各选项(及参数)的意义如下:

[java] view plain

  1. req 使用openssl的req子命令
  2. -new 生成新的证书请求
  3. -x509 生成自签名证书
  4. -days 5480 自签名证书的有效期5480天(15年)【仅当使用了 -x509 选项后有效】
  5. -keyout CA.key 私钥文件名指定为CA.key【若为运行前就已有的私钥文件且原名不是CA.key,则改名为CA.key;否则新生成的私钥文件命名为CA.key】
  6. -out CA.crt 指定输出所生成自签名证书的信息到文件,且文件名为CA.crt【建议不要省略】

其中,-days,-keyout 两个选项可以省略,省略的话使用默认值,有效期默认为 30 天【由程序内部在变量初始化的时候指定,与配置文件无关】,私钥文件名的默认值由配置文件 openssl.cnf 中相关条目指定,没改过的话为 privkey.pem。

选项 -out 若是省略的话,openssl不会以文件形式输出生成的 证书/证书请求,而是会默认将文件的信息直接打印到屏幕上,这在大多数情况下,是不符合我们要求的。所以建议这个选项最好不要省略!

req子命令可以通过 -key 选项为证书请求指定使用一个已存在的私钥文件。但在示例中的情况下,虽然使用了-new 和 -x509两个选项,但没有使用 -key 选项,这时,req子命令会自动为自签名证书生成一个RSA私钥,密钥长度的默认值由配置文件 openssl.cnf 中的相关条目指定,没改过的话为 1024 bits。

[2] 关于私钥文件加密口令的指定

运行中会提示输入加密口令,如下:

[java] view plain

  1. writing new private key to 'CA.key'
  2. Enter PEM pass phrase:
  3. Verifying - Enter PEM pass phrase:

此口令用于加密私钥文件 CA.key 中的私钥信息,如果不想在运行过程中还要输入加密口令,则可以使用选项 -passout 在命令中直接指定。选项 -passout 的使用形式为:

-passoutarg

其中,arg是选项 -passout 的参数,其格式有多种,详参《OpenSSL官方文档》中关于"PASS_PHRASE_ARGUMENTS"的介绍。

本小节典型示例中的命令,可以用选项 -passout 改造如下:

openssl req -new-x509 -days5480 -keyoutCA.key -out CA.crt**-passout**pass:1314

由于Linux系统中可以使用history命令查看历史指令记录,所以出于安全方面的考量,一般如非必要,不建议在命令中直接指定口令。这与MySQL登录的时候不在 -p 选项里直接指定登录口令的原因是一致的。

[3] 关于证书请求文件中的DN字段

运行中会提示输入一些 Distinguished Name fields,即证书的识别名信息字段,简称为DN字段,如下:

[java] view plain

  1. You are about to be asked to enter information that will be incorporated into your certificate request.
  2. What you are about to enter is what is called a Distinguished Name or a DN.
  3. There are quite a few fields but you can leave some blank
  4. For some fields there will be a default value,
  5. If you enter '.', the field will be left blank.

  6. Country Name (2 letter code) [GB]:US
  7. State or Province Name (full name) [Berkshire]:California
  8. Locality Name (eg, city) [Newbury]:
  9. Organization Name (eg, company) [My Company Ltd]:GeoAuth Inc.
  10. Organizational Unit Name (eg, section) []:.
  11. Common Name (eg, your name or your server's hostname) []:Authentication Global Root
  12. Email Address []:.

这些DN字段大部分有默认值,默认值由配置文件 openssl.cnf中相关条目指定。如要在某一个DN字段使用默认值,则无需输入任何信息,直接点击"Enter"键;如果确实某个DN字段的值要置为空,则输入一个 ' . ' 后,点击"Enter"键。

这些DN字段主要是拿来识别证书持有者身份的,下表是关于它们的缩写、说明和一些填写说明。【此部分参考了互动百科的SSL条目】

****DN字段名****缩写****说明****填写要求
Country NameC证书持有者所在国家要求填写国家代码,用2个字母表示
State or Province NameST证书持有者所在州或省份填写全称,可省略不填
Locality NameL证书持有者所在城市可省略不填
Organization NameO证书持有者所属组织或公司最好还是填一下
Organizational Unit NameOU证书持有者所属部门可省略不填
Common NameCN证书持有者的通用名必填。 对于非应用证书,它应该在一定程度上具有惟一性; 对于应用证书,一般填写服务器域名或通配符样式的域名。
Email Address证书持有者的通信邮箱可省略不填

表2-1 DN字段的说明

:表中所谓,证书不是应用证书时,其持有者的通用名要有“唯一性”,是指其通用名不要与一般主机上常见的信任证书列表或撤销证书列表中的证书产生重复。

如果不想在运行过程中逐个输入这些DN字段的值,则可以使用 -subj 选项在命令中直接指定。选项 -subj 的使用形式为:

-subj arg

其中,arg是选项 -subj 的参数,其格式类似于:/type0=value0/type1=value1/type2=... 形式。每一个 /type=value 形式的单元,都对应了一个完整的DN字段。其中,

/ 是每一个DN字段的开始标志;type0、type1等等,就是表2-1中提到的DN字段名的缩写;=是DN字段的名和值之间的间隔符; value0、value1等等,就是原本你要在运行过程中逐个输入的DN字段的值。

对于您要将值置为空的DN字段,您可以略去不写。本小节典型示例中的命令,可以用 -subj 选项改造如下【略去了 L 与 OU 两个DN字段】:

openssl req -new-x509 -days5480 -subj/C=US/ST=California/O=GeoAuth\ Inc./CN=Authentication\ Global\ Root -keyout CA.key -out CA.crt

需要特别注意的是,如果您设定的DN字段的值如果存在一些特殊字符【比如 (空格)、((半角左括号)、)(半角右括号)……】,必须经过\(反斜杆)转义。上例中已经给出了空格转义的情况。

[4] 如何指定自签名证书的密钥长度和类型

如前所述,示例只能生成密钥长度为1024bits的RSA公私钥对。如果要生成密钥长度不为1024bits的RSA公私钥对,或是其他类型的【比如DSA、EC】公私钥对,则必须使用选项 -newkey 来代替 -new 。选项 -newkey 的用法比较复杂,如需详细了解,请参看《OpenSSL官方文档》的相关页面。本小节典型示例中的命令等效于以下命令:

openssl req -newkeyrsa:1024 -x509 -days5480-keyoutCA.key -outCA.crt

要生成一个密钥长度为2048bits的RSA公私钥对,命令为:

openssl req -newkeyrsa:2048 -x509 -days5480-keyoutCA2048.key -outCA2048.crt

2.2 为顶级CA的私钥文件去除加密保护

上节提到,顶级CA的私钥文件是经过加密保护的,以后每当需读取 CA.key 文件中的私钥信息时,都需输入解密口令。这种做法适合有安全需求的场合,但如果觉得不方便,也可以去除这个口令。

典型示例:openssl rsa -inCA.key -outCA.key

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

[java] view plain

  1. rsa 使用openssl的rsa子命令
  2. -in CA.key 经加密保护的私钥文件
  3. -out CA.key 解除加密保护后的私钥文件【可以改名】

[2] 关于私钥文件解密口令的指定

运行中会提示输入解密口令,如下:,

[java] view plain

  1. Enter pass phrase for CA.key:
  2. writing RSA key

如果不想在运行过程中还要输入解密口令,则可以使用选项 -passin 在命令中直接指定。选项 -passin 的使用形式为:

-passinarg

其中,arg是选项 -passin 的参数,其格式同选项 -passout 的参数,详参《OpenSSL官方文档》中关于"PASS_PHRASE_ARGUMENTS"的介绍。

本小节典型示例中的命令,可以用选项 -passin 改造如下:

openssl rsa -inCA.key -out CA.key -passin pass:1314

基于同选项 -passout 一样的考量,一般不建议直接在命令中指定解密口令。

[3] rsa子命令的实际功能

rsa子命令的功能,更完整来说,应该是RSA密钥的管理。除了此处用到的去除加密保护,还可以用来:更换加解密口令,更换加解密算法【DES、三重DES、IDEA(官方文档上提到过,但是有些版本好像不支持,比如说我安装的)、AES(官方文档上没提到,我安装的版本支持)】,更换密钥文件的编码方式,等等。

2.3 为应用证书/中级证书生成私钥文件

典型示例:openssl genrsa**-out**app.key 2048

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

[java] view plain

  1. genrsa 使用openssl的genrsa子命令
  2. -out app.key 指定输出生成的私钥信息到文件,且文件名为app.key【建议别省略】
  3. 2048 指定所生成私钥的比特长度【务必放在最后一个】

其中,选项 -out 若是省略的话,openssl不会以文件形式输出生成的 私钥信息,而是会默认将私钥的信息直接打印到屏幕上,这不符合我们的要求。所以建议这个选项不要省略!

genrsa子命令还可以有其他一些选项及参数,但不论还有多少选项,都必须把指定私钥长度的参数放在最后一个。【如果指定私钥长度的参数不是最后一个,则其后的参数好像会被舍弃。】

[2] 私钥文件的加密保护

本小节典型示例所给出的命令,生成的是未经任何加密保护的私钥文件。这种方式用起来比较方便,但非常不安全。如果要为私钥文件附加加密保护,则有两种方式:

A.在生成私钥文件的同时就指定输出前要用某种加密算法加密保护;

B.生成明文的私钥文件后用 rsa 子命令附加某种加密算法的加密保护。

我计算机上安装的openssl版本,在两种方式下都支持这些加密算法选项:-des,-des3,-aes128,-aes192,-aes256。以加密选用192位的AES算法为例,命令如下:

[java] view plain

  1. // 在生成私钥文件的同时就指定输出前要用192位的AES算法加密保护
  2. openssl genrsa -aes192 -out app.key 1024
  3. // 生成明文的私钥文件后用 rsa 子命令附加192位的AES算法加密保护
  4. openssl rsa -aes192 -in app.key -out app.key

上例中的两个命令,都会要求在运行中输入加密口令。同样的,虽然不建议,但是openssl依然支持在命令中使用选项 -passout 指定加密口令,选项 -passout 的用法参考2.1小节。唯一需要额外注意的是,对于genrsa子命令,选项 -passout 应放在 指定密钥长度的参数 前面。

2.4 为应用证书/中级证书生成 csr 文件【证书请求文件】

典型示例:openssl req -keyapp.key -out app.csr

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

[java] view plain

  1. req 使用openssl的req子命令
  2. -new 生成新的证书请求
  3. -key app.key 指定是为app.key文件中的私钥生成证书请求
  4. -out app.csr 指定输出所生成证书请求的信息到文件,且文件名为app.csr

这和2.1节使用的是openssl的同一个子命令,所以参数的意义很多具有共通性。命令运行中也会要求输入一些DN字段的值,参看本文2.1 [3] 中的相关介绍。同样的,可以使用-subj选项在命令中直接指定这些DN字段的值。

2.5 为 csr 文件签名,生成应用证书/中级证书

典型示例:openssl ca**-in**app.csr -outapp.crt -certCA.crt -keyfileCA.key -days1826 -policypolicy_anything

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

[java] view plain

  1. ca 使用openssl的ca子命令
  2. -in app.csr 指定待签发证书的 CSR文件为 app.csr
  3. -out app.crt 指定输出所签发证书的信息到文件,且文件名为app.crt【建议不要省略】
  4. -cert CA.crt 指定为应用/中级证书签名的CA的公钥证书为CA.crt【用到CA证书的持有者信息】
  5. -keyfile CA.key 指定为应用/中级证书签名的CA的私钥文件为CA.key【用CA私钥实际执行签名】
  6. -days 1826 指定所签发证书的有效期为1826天(5年)
  7. -policy policy_anything 指定签发策略为 policy_anything 【即,允许所签发证书的持有者信息和颁发者信息之间不遵守任何匹配策略】

其中,选项 -out 若是省略的话,openssl不会以文件形式输出生成的 应用证书/中级证书信息,而是会默认将证书的信息直接打印到屏幕上,这一般不符合我们的要求。所以建议这个选项不要省略!