6.1 配置文件
openssl的许多应用程序和函数使用配置文件获取默认的信息和选项,所以,要使用Opnessl,尤其使用openssl的指令。
6.1.1 配置文件概述
openssl提供的主要配置文件是openssl.cnf,他集成了openssl所要的配置文件选项的大部分内容。
使用形式:变量名=变量值
注意事项:
a.变量值域可支持由"\"或者需要用其他引用符号声明的特殊字符,如果“\"符号需要这样声明:"\"。此外,变量值域还支持在行末尾使用"\"作为连接符号来使得可以使用多行数据作为一个值域。
例如:“\r” “\n”
b.变量值域还支持其他变量值的展开。使用"$变量名"或者“${变量名}的形式”,可以展开当前字段名为
例如:
dir=./demoCA
certs=$./demoCA/certs
<=>certs=./demoCA/certs
c.如要展开其他字段的变量值,则可以使用"$字段名::变量名"或者“$字段名::变量名}”的形式
[Section1]
home = /home
[Section2]
dir = ${Sention1::home}/dragonking
=>dir =/home/dragonking
e.openssl的配置文件中,“#”为注释符号
f.使用-config选项来指定配置文件,默认的就是openssl.cnf文件。
6.1.3 配置文件中的证书请求配置
a.证书请求主配置字段
参数 | 参数值域 | 参数作用描述 |
default_bits | | 生成的证书中的密钥对的长度 |
default_keyfile | 文件名 | 生成私钥的输出保存文件 |
input_password | 字符串 | 当要读取输入私钥文件时候的口令 |
output_password | 字符串 | 保存输出私钥文件的口令 |
oid_file | 文件名 | 定义扩展对象的文件名 |
oid_section | 字段名 | 定义扩展对象的字段名 |
RANDFILE | 文件名 | 随机数种子文件 |
encrypt_key | yes或no | 如果该参数值设置为no, 那么生成的你要将不会采用加密保护 |
default_md | md5 sha1 md2 mdc2 | 定义签名使用的信息摘要算法,默认是MD5 |
string_mask | 字符类型描述名 | 为一些字段制定特定字符串类型, 比如证书请求中的城市和组织名称等字段就可以使用这样的方法制定, 这使得证书可以支持如汉字这样的多字节字符 |
default | PrintableString,T61String和BMPString三种类型 |
pkix | 定义包括PrintableString和BMPString两种字符串类型 |
utf8only | 只是用UTFString类型 |
nombstr | 仅使用PrintableString和T61String, 不使用多字节的字符串类型 |
req_extensions | 字段名 | 指定了证书请求扩展字段名, 这个字段定义了要加入到证书请求中的一系列扩展项 |
x509_extensions | 字段名 | 指定了生成字签名证书时要使用证书扩展项字段, 该字段定义了一系列要加入到证书中的扩展项 |
prompt | yes或no | 如果该值设定为no, 那么req指令不会在要求用户输入一些证书字段的信息, 而是直接从配置问价读取该字段的值。 |
utf8 | yes或no | 如果设置为yes, 那么任何证书域要输入的值被解析成UTF8格式的字符串, 而默认的情况下使用是ASCII编码。 |
atrributes | 字段名 | 指定了定义证书请求属性的字段名, 这个字段定义了证书请求的一些属性, 典型的如验证密码和别名,在Openssl的证书签发工具中, 这些属性是没有用的,但是有些CA会要求这些属性。 该字段定义变量的格式跟distinguished_name字段的格式是一样的, 都会受到Promppt的值影响 |
distinguished_name | 字段名 | 定义了输入用户信息选项的特征名称字段名, 该字段包含了多想用户信息项。 |
b.特征名称字段
c.证书请求属性字段
d.证书请求扩展字段
6.1.4 配置文件中的证书签发配置
a.CA主配置字段
参数名 | 参数值域 | 参数作用描述 |
oid_file | 文件名 | 定义扩展对象的文件名 |
oid_section | 字段名 | 定义扩展对象的字段名 |
new_certs_dir | 目录名 | 存放CA指令签发生成新证书的目录, 该参数是必须提供的 |
certificate | 文件名 | 存放CA证书文件,改参数是必须提供的 |
private_key | 文件名 | 存放CA私钥的文件,改参数是必须提供的 |
RANDFILE | 文件名 | 用于读写随机数种子的文件,也可以是一个EGD socket |
default_days | 正整数 | 签发证书的有效期,以天威单位 |
defualt_startdate | 时间格式 | 证书失效的日期,格式为YYMMDDHHNNSSZ,该选项没有设置, 则使用当前时间间隔,在生成CRL的时候, 该选项和default_crl_days参数必须有一个 |
default_enddate | 时间格式 | 证书失效的日期,格式为YYMMDDHHNNSSZ, 该选项和default_days,选项至少应该有一个 |
default_crl_hours | 正整数 | 从当前CRL到下次CRL发布以消失为单位的时间间隔, 在生成CRL的时候,该选项和defualt_crl_days参数必须有一个 |
default_crl_days | 正整数 | 从当前CRL到下次CRL发布以天威单位的时间间隔, 在生成CRL的时候,该选项和default_crl_hours参数必须有一个 |
default_md | md5 md2 mdc2 sha1 | 签发证书时采用的信息摘要算法, 选定的信息摘要算法也用于CRL的签发 |
database | 文件名 | Openssl定义的用于以签发证书的文本数据库文件, 这个文件通常初始化的时候是空文件,但是确实必须提供的参数 |
serialfile | 文件名 | 证书签发时使用的序列号参考文件, 该文件的序列号是以十六进制的格式存放的, 该文件必须提供并且应该包含一个有效的序列号 |
x509_extensions | 字段名 | 指定了生成自签名证书时要使用的证书扩展项字段, 该字段定义了一些列要加入证书中的扩展项 |
crl_extensions | 字段名 | 生成CRL时加入的扩展项定义字段, 如果没有提供CRL扩展项,那么生成的CRL就是V1版本的 |
preserve | no或yes | 通常情况下,证书签发的特种名称(DN)域的各个参数顺序是跟证书匹配策略的参数顺序一致的, 但是,如果preserve参数值为yes,那么各个参数的顺序就保持跟证书请求的一致 |
email_in_dn | no或yes | 如果该值设置为no,那么证书请求中的E-mail信息会被从证书DN域删除, 但是可以作为扩展项存在。 如果没有设置改参数,那么默认是将E-mail信息放置在DN域中的 |
msie_hack | no或yes | 这是为了兼容老版本的微软IE而设置的参数,在基本废弃不用了 |
policy | 字段名 | 指定用于证书请求DN域匹配策略的字段, 该字段的策略决定CA要求和处理证书请求提供的DN域各个参数值的规则 |
nameopt | 证书DN域显示方式选项,其可选值跟X509指令-nameopt选项是相同的 | 指定当前需要用户确认签发证书的时候显示的可读证书DN域显示方式,详细的请参考后面介绍x509指令的章节 |
certopt | 证书域显示选项,其可选值跟x509指令-certopt选项是相同的,但是no_signame和no_sigdump总是被默认设置 | 指定当需要用户确认签发证书的时候显示的证书域的方式, 详细请参考后面介绍x509指令的章节 |
copy_extensions | none,copy或copyall | 该参数决定了证书请求中的扩展项信息是否加入到证书扩展项中, 如果该项没有定义或者设置none, 那么所有证书请求的扩展项中没有的项目就会被复制到证书中; 如果值为copyall,那么证书请求扩展项中所有选项都会被复制到证书扩展项中, 如果在证书扩展项中已经存在该项,那么证书扩展项的项目会首先被删除,然后再从证书请求中复制过来。 |
UTCTime时间格式
6.1.5 配置文件中X.509 V3证书扩展项
a.扩展项字段应用概述
X.509 v3证书已经得到了广发应用,其最大的特色就是增加了扩展项的支持。
b.扩展项字段变量变量格式
字符串扩展项
nsComment = "This is a comment"
多值扩展项
basicContraints = critical,@bs_section
[bs_section]
CA=true
pathlen=1
原始扩展项
c.扩展项字段变量种类
X.509 v3证书的扩展项的主要目的是为了能够对证书和其相关私钥的用途和使用方法做出限制,从而提供证书的课管理型。
a.描述字符串型的扩展项
扩展项:nsBaseUrl, nsRevocationUrl, nsCaRevocationUrl, nsRenewalUrl, nsCaPolicyUrl, nsSslServerName和nsComment.
例如:nsComment="DragonKing Generated Certificagte"
b.证书类型(nsCertType)扩展项
nsCetType是Netscape定义制定证书用途的扩展项。
参数值 | 说明 |
client | 用于客户端的证书 |
server | 用于服务器的证书 |
email | 用户e-mail安全协议的证书 |
objsign | 用于签发的证书 |
sslCA | 用于签发SSL用户证书的CA证书 |
emailCA | 用于签发E-mail用户证书的CA证书 |
objCA | 用于签发用户签名证书的CA证书 |
reserved | 保留值 |
keyUsage定义值
参数值 | 说明 |
digitalSignature | 用于数字签名的密钥 |
nonRequdiation | 用于提供不可否认服务的密钥,一般是第三方公正机构使用的密钥 |
keyEncipherment | 用于对其他密钥或相关安全信息进行加密,可以也能给予密钥安全传输 |
dataEncipherment | 用于对用户数据进行加密的密钥 |
keyAgreement | 用于商定或建立进一步操作需要的密钥的密钥 |
keyCertSgin | 用于验证证书签名的密钥,也就是CA的公钥,这只有在CA证书中才有效 |
cRLSign | 用于验证CA对CRL签名的密钥 |
encipherOnly | 密钥仅用于加密 |
decipherOnly | 密钥仅用于解密 |
d.基本限制(basicConstraints)扩展项
e.扩展密钥(extendedKeyUsage)扩展项
f.主体密钥标识(subjectKeyIdentifier)扩展项
主体密钥标识用于在证书拥有多个密钥集的时候指定密钥属于哪个密钥集。
g.验证机构密钥标识(authorityKeyIdentifier)扩展项
验证机构密钥标识用于构造证书链的时候标识签发机构的证书和密钥,证书中的验证机构密钥标识包括三个部分:密钥ID(keyID)、验证机构DN和CA证书序列号。
如果给定keyid,那么CA签发证书的时候就会复制CA证书的主题密钥标识到新签发的证书中,一般来说,虽然给定了issure值,但是只有keyid出显但复制主体密钥失败或者keyid没有给定的情况下才会执行CA证书DN和序列号的复制操作。
h.主体别名(subjectAltName)扩展项
主体别名为证书提供了形式更加灵活的命名方式,理论上可以包含IP地址、URL、电子邮件及域名等信息作为主体别名。
i.颁发者别名(issuerAltName)扩展项
颁发者别名扩展项为颁发这的证书提供了不同形式的命名方式,他采用的形式跟上述的主题别名基本一致。
j.验证机构信息处理(authorityInfoAccess)扩展项
验证机构信息处理扩展给出了如何处理跟CA相关的信息的详细细节。
accessOID;location
k.CRL分布点(crlDistributionPoints)扩展项
CRL分布店扩展项用于指明用户为了验证证书吊销状态而需要查找CRL信息的发布点。
l.证书策略(certificatePolicies)扩展项
证书策略扩展项定义了证书应用的策略,比如用于证书验证的策略。证书策略扩展项目前使用并不多,支持的软件业很少。
6.2 文件编码格式
openssl中虽然使用PEM作为基本的文件编码格式,但是,由于不同的对象其封装的标准格式不太一样,所以经常会导致读者产生迷惑。
6.2.1 数据编码格式
Openssl的编码是基于ASN.1标准的,ASN.1全称为Abstract Syntax Notation One,是一种描述数字对象的方法和标准。ASN.1是一种结构化的数字对象描述语言,她包括了两部分,分别为数据描述语言和数据编码规则。
PEM编码全称是Privacy Enhanced Mail,是一种保密邮件的编码标准。
a.信息转换为ASCII码或其他编码方式,比如采用DER编码
b.使用对称加密算法加密经过编码的信息
c.使用BASE64对加密后的信息进行编码
d.使用一些头定义对信息进行封装,主要包含了进行正确解码需要的信息如:
Proc-Type,4:ENCRYPTED
DEK-Info:cipher-name,ivec
e.在这些信息的前面加上形式头标注信息
—BEGINPRIVACYENHANCED MESSAGE—
在这些信息的后面加上如下形式尾标注信息:
—ENDPRIVACYENHANCED MESSAGE—
它在上述第一步采用的是DER编码,所以,从本质上来说,openssl的PEM编码就是在DER编码基础上进行BASE64编码,然后添加一些头尾信息组成。
6.2.2 证书编码
a.X.509
b.PKCS#12证书
c.PKCS#7证书
6.3 文本数据库
Openssl的文本数据库结构非常简单,每一行代表一条完整的记录,每条记录对应一个已经签发的证书。一般来说,每条记录包括六个可选的字段,分别是:证书状态、证书生效时间、证书到期时间、证书序列号、证书存放路径及证书的特征名称(DN)值。
6.4 序列号文件
序列号文件是ca指令签发证书的时候的依据文件之一,他从该文件读取当前签发的证书的序列号并将序列号文件中的序列号加1.
6.5 随机数文件
无论使用Openssl的指令还是其API,随机数文件都是会经常碰到的一个概念。
6.6 口令输入方式
口令输入方式 | 表示 |
提示输入 | -passin stdin |
直接输入 | -passin pass:12345678 |
环境变量输入 | -pass env:passwdvar |
文件输入 | -passin file:filename |
描述符输入 | -passin fd:number |