声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我本身所作的工做主要是针对新的1.0.2版本进行验证,修改错别字,和错误,从新排版,以及整理分类,配图。 未经做者容许,严禁用于商业出版,不然追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!node
1 标准命令
查看帮助的办法:openssl 命令 -h。git
命令 功能 备注
证书类 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX =====
req PKCS10 X.509证书签名请求(CSR)管理。 申请证书
x509 X.509证书管理。显示证书信息、转换证书格式、签名证书请求及改变证书信任设置 证书工具
verify X.509证书验证。 证书验证
ca 证书颁发机构(CA)管理。签发证书请求和生成CRL,维护一个已签发证书状态的文本数据库。 证书中心
crl 证书撤销清单(CRL)管理。工具,用于处理PEM或DER格式的CRL文件 证书吊销
crl2pkcs7 CRL到PKCS#7转换。根据CRL或者证书生成pkcs7消息; 证书吊销
对称加密 *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* =====
enc 加密和解密 对称加解密
摘要 *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* ====
dgst 消息摘要计算。 摘要集合
非对称 XXXXXXXXX全部的非对称均可以使用pkey系列来操做,鼓励使用pkey系列XXXXXXX ======
pkey 公钥和私钥管理。 非对称加密
pkeyparam 公钥算法参数管理。 非对称加密
pkeyutl 公钥算法加密操做实用程序。 非对称加密
genpkey 生成私钥或参数。 非对称加密
PKI XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
pkcs7 PKCS7加密消息语法,各类消息存放的格式标准;用于处理DER或者PEM格式的pkcs7文件 消息格式
pkcs8 私钥转换工具,pkcs8格式 转换证书
pkcs12 PKCS12数据管理。工具,用于生成和分析pkcs12文件 我的证书
工具 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX =======
asn1parse 解析ASN.1序列。用于诊断ASN.1结构的工具,也可从ASN.1数据中提取数据; 诊断工具
ciphers 密码套件描述,显示支持的加密套件
cms CMS(加密消息语法)实用程序
engine 引擎(loadble模块)信息和操纵。
errstr 错误字符串转换的错误号。
nseq 建立或检查netscape证书序列,多证书与netscape证书序列间相互转化 序列转换
ocsp 在线证书状态协议实用程序。 在线证书状态
passwd 生成散列密码。生成各类口令密文
prime 检查一个数是不是素数
rand 生成伪随机字节。
smime S / MIME邮件处理。处理S/MIME邮件,加密、解密、签名和验证 邮件验证工具
speed 算法速度测量。,调整测试库的性能 性能工具
s_time SSL链接定时器。提供的SSL/TLS性能测试工具,测试服务 性能工具
spkac SPKAC打印和生成实用程序
ts 时间戳机构工具(客户端/服务器)
sess_id SSL会话数据管理。SSL/TLS协议的session处理工具 协议会话工具
s_client 这将实现一个通用SSL / TLS客户端,能够创建与远程服务器的SSL / TLS透明链接。 协议会话工具
s_server 这实现了一个通用SSL / TLS服务器,它接受来自远程客户端的SSL / TLS链接。 协议会话工具
version OpenSSL版本信息。
===========所有已经时的禁止再使用,主要为了兼容===================
ec EC(椭圆曲线)密钥处理,用于数字签名和加密 ecc算法
ecparam EC参数的操做和生成,产生ECC密钥对。用于数字签名和加密 ecc算法
dh Diffie-Hellman参数管理。被dhparam淘汰了 dh算法
gendh 生成Diffie-Hellman参数。被dhparam淘汰了 dh算法
dhparam 生成和管理Diffie-Hellman参数。被genpkey和pkeyparam取代 dh算法
genrsa 生成RSA私钥。由genpkey取代 rsa算法
rsa RSA密钥管理。处理RSA密钥、格式转换和打印信息 rsa算法
rsautl RSA实用程序用于签名,验证,加密和解密。取而代之的是pkeyutl rsa算法
dsa DSA数据管理。处理DSA密钥、格式转换和打印信息,用于数字签名 dsa算法
dsaparam DSA参数生成与管理。用于生成和操做dsa证书参数,用于数字签名,被genpkey和pkeyparam取代 dsa算法
gendsa 从参数生成DSA私钥。生成DSA密钥,密钥参数用dsaparam生成,用于数字签名,由genpkey和pkey取代 dsa算法
2 命令详解
2.1 enc
对称加密算法工具。它可以运用块或者流算法对数据加/解密。还可以把加密/接密,还能够把结果进行base64编码。web
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]
1
2
3
-in filename —— 输入文件
-out filename ——输出文件,省略则为标准输出
-pass arg —— 口令设置,用于没有提供密钥时,采用摘要算法从口令中生成一个密钥,若是加密时使用了口令,则解密也要使用口令,arg以下所示:
-pass pass:"123" #密码是123
-pass pass:123 #密码是123
-pass evn:VAR #密码从环境变量VAR中去
-pass file:p.txt #密码从文件p.txt第一行取,不包括换行符,注意DOS格式的^M及回车符。
-pass fd:3 #密码从文件描述符3中读
-pass stdin #标准输入
1
2
3
4
5
6
-e —— 加密,二选一
-d —— 解密,二选一
-a/-base64 —— 加密时设置结果以base64编码,,解密时设置输入为base64
-A ——加密时设置结果以base64编码成一行,解密时设置输入为一行base64
-k password—— 口令,已经被-pass代替,二选一
-kfile filename] —— 口令文件 已经被-pass代替,二选一
-K key —— 加密秘钥,16进制
-iv IV ——初始向量,16进制
-S salt ——指定16进制盐值
-salt ——带有随机盐值 二选一
-nosalt ——不带盐值,已经关闭此选项,二选一
-z ——是否压缩,须要编译时选择了zlib库
-md digstname —— 摘要算法,当没有提供密钥时候,用于从口令中生成一个密钥,默认md5
-p ——打印出使用的salt、口令以及初始化向量IV。二选一
-P ——打印出使用的salt、口令以及初始化向量IV。不作加解密,二选一
-bufsize number ——缓冲区大小
-nopad ——无填充
-debug ——打印调试信息
-none ——不执行加 解密
-engine id ——引擎
-cihername ——要使用的加密算法,支持的加密算法以下算法
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cbc-hmac-sha256
-aes-128-ccm -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ctr -aes-128-ecb
-aes-128-gcm -aes-128-ofb -aes-128-xts
-aes-192-cbc -aes-192-ccm -aes-192-cfb
-aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr
-aes-192-ecb -aes-192-gcm -aes-192-ofb
-aes-256-cbc -aes-256-cbc-hmac-sha1 -aes-256-cbc-hmac-sha256
-aes-256-ccm -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ctr -aes-256-ecb
-aes-256-gcm -aes-256-ofb -aes-256-xts
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1
-camellia-128-cfb8 -camellia-128-ecb -camellia-128-ofb
-camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1
-camellia-192-cfb8 -camellia-192-ecb -camellia-192-ofb
-camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1
-camellia-256-cfb8 -camellia-256-ecb -camellia-256-ofb
-camellia128 -camellia192 -camellia256
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8
-des-ede3-ofb -des-ofb -des3
-desx -desx-cbc -id-aes128-CCM
-id-aes128-GCM -id-aes128-wrap -id-aes192-CCM
-id-aes192-GCM -id-aes192-wrap -id-aes256-CCM
-id-aes256-GCM -id-aes256-wrap -id-smime-alg-CMS3DESwrap
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40
-rc4-hmac-md5 -seed -seed-cbc
-seed-cfb -seed-ecb -seed-ofb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
注意:
该程序能够经过openssl ciphername或者openssl enc -ciphername 两种方式调用,可是前一种不支持引擎加密.
应在配置文件中配置提供全新加密算法的引擎(如提供gost89算法的ccgost引擎)。在命令行中使用-engine选项指定的引擎只能用于由配置文件中指定的OpenSSL内核或其余引擎支持的密码的硬件辅助实现。
当enc命令列出支持的加密算法时,也列出了配置文件中指定的引擎提供的算法。
若是须要,将提示输入密钥以得到密钥。
若是从密码派生密钥,则应使用-salt选项,除非您但愿与之前版本的OpenSSL和SSLeay兼容。没有-salt选项,能够对密码执行有效的字典攻击,并攻击流密码加密数据。缘由是没有slat,相同的密码老是生成相同的加密密钥。当slat被使用时,加密数据的前八个字节被保留给盐:它在加密文件时被随机生成,而且在被解密时从加密文件读取。
一些密码没有大的密钥,若是不正确使用,会带来安全隐患。建议初学者在CBC模式下使用强分组密码,如bf或des3。
全部块密码一般使用PKCS#5填充也称为标准块填充:这容许执行基本的完整性或密码检查。然而,因为随机数据经过测试的机会优于256中的1,这不是一个很是好的测试。
若是禁止填充,则输入数据必须是密码块长度的倍数。
全部RC2密码具备相同的密钥和有效的密钥长度。
Blowfish和RC5算法使用128位密钥。
//加密(提供密钥)
$openssl enc -aes-128-cbc -e -K 000 -iv 000 -in test.txt -out test.cipher -a -A -p
//解密
$openssl enc -aes-128-cbc -d -K 000 -iv 000 -in test.ciphet -a -A -out test.plain -p
//加密(提供口令)
$openssl enc -aes-128-cbc -e -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.txt -out test.cipher -a -A -p
//解密
$openssl enc -aes-128-cbc -d -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.cipher -out test.plain -a -A -p
1
2
3
4
5
6
7
8
9
2.2 dgst
主要用于数据摘要。它也能够用于数据签名以及验证签名数据库
openssl dgst [-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1] [-c] [-d] [-hex] [-binary]
[-r][-non-fips-allow] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename]
[-signature filename] [-hmac key] [-non-fips-allow] [-fips-fingerprint] [file...]
1
2
3
-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1 摘要算法,多选一
-c ——当设置了-hex,输出结果每两个字符中加一个冒号
-d ——打印出BIO调试信息值。
-hex ——以十六进输出结果,二选一
-binary ——以二进制输出结果,二选一
-r —— 以sha1sum的“coreutils”格式输出摘要
-non-fips-allow —— 容许在FIPS模式使用非FIPS算法
-out filename—— 输出文件,默认标准输出
-sign filename—— 使用文件中的私钥签名
-keyform arg —— 私钥格式,PEM | DER
-passin arg—— 私钥密码
-verify filename ——公钥验签
-prverify filename ——私钥验签
-signature filename ——签名文件
-hmac key ——hmac 秘钥
-non-fips-allow ——容许在FIPS模式使用非FIPS算法
-fips-fingerprint ——在某些openssl——FIPS中使用特殊密钥计算HMAC
file ——输入文件
注意windows
全部新应用程序的选择的摘要算法是SHA1。 然而其余摘要算法仍然被普遍使用。
在签名时,dgst将根据私钥的ASN.1信息自动肯定用于签名的算法(RSA,ECC等)。
当验证签名时,它只处理RSA,DSA或ECDSA签名自己,而不是分析相关数据来识别签名者和相关算法,如x.509,CMS和S / MIME的签名者和算法。
某些签名算法,特别是ECDSA和DSA须要一个随机数源。
仅当单个文件要签名或验证时,才能使用签名和验证选项。
十六进制签名没法使用openssl进行验证。使用“xxd -r”或相似程序在验证以前将十六进制签名转换为二进制签名。
例子安全
//计算摘要
$openssl dgst -sh1 -c -hex -out md.sha1 test.txt
//私钥签名
$ openssl dgst -sign rsa_pri.key -keyform PEM -passin pass:123456 -out rsa_sign.sig test.txt
//私钥验签
$openssl dgst -prverify rsa_pri.key -keyform PEM -passin pass:123456 -signature rsa_sign.sig test.txt
//公钥验签
$openssl dgst -verify rsa_pub.key -keyform PEM -signature rsa_sign.sig test.txt
//hmac
$openssl dgst -hmac rsa_pri.key -keyform PEM -passin pass:123456 -sha1 -out rsa.hmac test.txt
1
2
3
4
5
6
7
8
9
10
2.3 非对称
2.3.1 pkeyparam
公共密钥算法的参数处理工具。它可以处理公钥或私钥文件。它可以转换组件信息并将它们打印出来。服务器
openssl pkeyparam [-in filename] [-out filename] [-text] [-noout] [-engine id]
1
-in filename——输入文件, 若是未指定此选项,则从标准输入读取。
-out filename——输出文件,若是未指定此选项,则输出参数到标准输出
-text——除了编码版本信息本外,以明文打印出参数
-noout——不打印参数编码的版本信息。
engine id——引擎
注意
该命令没有-inform或-outform选项,由于仅支持PEM格式,由于密钥类型由PEM头决定。
例子
$ openssl pkeyparam -in param.pem -text
1
2.3.2 genpkey
生成一个私钥。网络
openssl genpkey [-out filename] [-outform PEM|DER] [-pass arg] [-cipher] [-engine id]
[-paramfile file] [-algorithm alg] [-pkeyopt opt:value][-genparam] [-text]
1
2
3
-out filename——输出文件名。若是未指定此参数,则使用标准输出。
-outform PEM|DER——输出格式
-pass arg—— 私钥访问密码
-cipher——私钥的对称加密方式
-engine id——引擎,如要使用应该放在第一个位置
-paramfile file—— 一些公钥算法基于一组参数生成私钥。可使用此选项提供参数。若是使用此选项,则使用的公钥算法由参数决定。若是使用此选项则必须在-pkeyopt选项以前。选项-paramfile和 -algorithm是互斥的。
-algorithm alg—— 使用公钥算法如RSA,DSA或DH。若是使用此选项,则必须位于任何-pkeyopt选项以前。 -paramfile和-algorithm选项是互斥的。
-pkeyopt opt:value——设置公钥算法选项选择值。支持的精确选项取决于所使用的公钥算法及其实现。有关更多详细信息,请参见下面的密钥生成选项。
-genparam——生成一组参数,而不是私钥。若是使用此选项必须在-paramfile 和 -algorithm, -pkeyopt 选项以前。
-text——打印私钥和公钥和参数(PEM或DER结构)的(未加密)文本。
密钥生成选项——每一个算法支持的选项以及算法的每一个实现均可以有所不一样。 OpenSSL实现的选项以下。session
RSA关键生成选项
rsa_keygen_bits:NUMBITS——生成的密钥中的比特数。若是未指定1024。
rsa_keygen_pubexp:value——RSA公众指数值。若是前面加上0x,这能够是一个大的十进制或十六进制值。默认值为65537。
DSA参数生成选项
dsa_paramgen_bits:NUMBITS——生成参数中的位数。若是未指定1024。
DH参数生成选项
dh_paramgen_prime_len:NUMBITS——素数参数p的位数。
dh_paramgen_generator:value——生成g所用的的值。
dh_rfc5114:NUM—— 若是设置了此选项,则使用相应的RFC5114参数,而不是生成新参数。值num能够采用与RFC5114 DH参数相对应的值1,2或3,该参数包括1024位组与160位子组,2048位组与224位子组和2048位组与256位子组,如RFC5114第2.1,2.2节中所述和2.3
EC参数生成选项
ec_paramgen_curve:_curve——要使用的ECC曲线
GOST2001密钥生成和参数选项
Gost 2001支持默认状况下不启用。要启用此算法,应在OpenSSL配置文件中加载ccgost引擎。有关详细信息,请参阅源分发引擎/ ccgost directiry中的README.gost文件。 使用GOST R 34.10算法的参数文件是可选的。参数能够在密钥生成期间直接指定,也能够在生成参数文件期间指定。
paramset:name——根据RFC 4357指定GOST R 34.10-2001参数集。参数集可使用缩写名称,对象短名称或数字OID进行指定。支持如下参数集:
paramset OID Usage
A 1.2.643.2.2.35.1 Signature
B 1.2.643.2.2.35.2 Signature
C 1.2.643.2.2.35.3 Signature
XA 1.2.643.2.2.36.0 Key exchange
XB 1.2.643.2.2.36.1 Key exchange
test 1.2.643.2.2.35.0 Test purposes
1
2
3
4
5
6
7
注意
鼓励使用genpkey,由于可使用额外的算法选项和ENGINE提供的算法。
例子
//生成RSA私钥
$openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc \
-algorithm RSA -pkeyopt rsa_keygen_bits:1024 -text
//这种方式生成的RSA私钥 不只代用 私钥和大数,还代用公钥,以及其它信息,以用于快速计算。
1
2
3
4
2.3.3 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]
1
2
3
-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
1
2
3
4
5
6
2.3.4 pkeyutl
&emsp pkeyutl命令可用于执行支持的公钥操做.
openssl pkeyutl [-in file] [-out file] [-sigfile file] [-inkey file]
[-keyform PEM|DER] [-passin arg] [-peerkey file] [-peerform PEM|DER] [-pubin]
[-certin] [-rev] [-sign] [-verify] [-verifyrecover] [-encrypt][-decrypt]
[-derive] [-pkeyopt opt:value] [-hexdump] [-asn1parse] [-engine id]
1
2
3
4
5
6
-in file——输入文件,若是不指定,则从标准输入读取
-out file——输出文件,若是不指定,则输出到标准输出
-sigfile file——签名文件,默认为标准输入
-inkey file——输入密钥文件,默认状况下应该是一个私钥
-keyform PEM|DER——密钥格式为PEM,DER或ENGINE
-passin arg——输入密钥的口令
-peerkey file——对等密钥文件,由密钥导出(协议)操做使用
-peerform PEM|DER—— 指定对等密钥格式为PEM,DER或ENGINE
-pubin—— 输入密钥是一个公钥,默认为私钥
-certin——输入的是包含公钥的证书。
-rev——反转输入缓冲器的顺序。这对于以小端序格式表示缓冲区的一些库(如CryptoAPI)颇有用。
-sign——给输入文件签名,须要私钥
-verify——根据签名文件验证输入数据,并指示验证是成功仍是失败
-verifyrecover——验证输入数据并输出转换后的数据
-encrypt——使用公钥加密输入数据
-decrypt——使用私钥解密输入数据
-derive—— 使用对等密钥导出共享密钥
-pkeyopt opt:value——公钥参数选项
-hexdump——hex转储输出数据。
-asn1parse—— 对输出的数据进行ASN1分析。当对ASN1结构签名与-verifyrecover选项联合使用很是有用
-engine id——引擎
注意:支持的操做和选项根据密钥算法及其实现而有所不一样。 OpenSSL操做和选项以下所示。
除非另有说明,不然全部算法都支持digest:alg选项,指定摘要算法进行签名,验签和verifyrecover操做。值alg应该是EVP_get_digestbyname()函数中使用的摘要名称,例如sha1。该值仅用于对传入pkeyutl的数据的长度进行健全检查,并用于建立构成签名的结构(例如RSASSA PKCS#1 v1.5签名中的DigestInfo)。在RSA,ECDSA和DSA签名的状况下,该实用程序不会对输入数据执行散列,而是直接使用数据做为签名算法的输入。(所以要注意的输入的数据长度)
根据密钥类型,签名类型和填充模式,输入数据的最大可接受长度不一样。通常来讲,使用RSA,签名数据不能长于密钥模数,在ECDSA和DSA的状况下,数据不该该长于字段大小,不然将被默认地截断为字段大小。换句话说,若是digest的值为sha1,则输入应为SHA-1函数输出的20字节长的二进制编码。
RSA算法,RSA算法一般支持encrypt,decrypt,sign,verify和verifyrecover操做。一些填充模式只支持其中一些操做
rsa_padding_mode:mode
RSA中的参数rsa_padding_mode:mode设置RSA的填充模式,支持的填充模式有:用PKCS#1来设置PKCS#1填充模式,用sslv23来设置SSLv23填充模式,用none来设置no填充模式,用oaep来设置OAEP填充模式,用x931来设置X9.31填充模式以及用pss来设置PSS。
在PKCS#1填充中,若是摘要算法未设置,则提供的数据将被直接签名或验证,而不是使用DigestInfo结构。若是设置摘要,则使用DigestInfo结构,其长度必须对应于摘要类型。
对于oeap模式,仅支持加密和解密。
对X9.31填充模式来讲,若是设置了摘要算法,并将它用于格式块数据,不然第一个字节必需要用X9.31摘要ID。它支持签名、验证签名以及验证恢复操做。
对于pss模式,仅支持签名和验证,而且必须指定摘要算法
rsa_pss_saltlen:LEN
对于pss模式,只有此选项指定填充长度。它支持两个值:
-1设置填充长度为摘要长度。
-2表示当签名的时候,设置填充字节为最大的可容许的字节数。当验证的时候,表示填充字节由块结构体来决定。
DSA算法——DSA算法仅支持sign和verify操做。 目前除了digest以外没有其余选项。 默认状况下,只能使用SHA1摘要,并默认此摘要算法。
DH算法—— DH算法只支持derived操做,没有附加选项。
EC算法——EC算法支持sign,verify和derived操做。 sign和verify操做使用ECDSA,derived使用ECDH。 目前除了digest以外没有其余选项。 只支持SHA1摘要,默认摘此要算法 。
举列
//签名
$openssl pkeyutl -sign -inkey rsa_pri.key -keyform PEM -passin pass:123456 -in md.sha1 -out md.sig
//验签
$openssl pkeyutl -verify -inkey rsa_pub.key -keyform PEM -pubin -in md.sha1 -sigfile md.sig
//加密
$openssl pkeyutl -encrypt -inkey rsa_pub.key -keyform PEM -pubin -in md.sha1 -out md.cipher
//解密
$openssl pkeyutl -decrypt -inkey rsa_pri.key -keyform PEM -passin pass:123456 -in md.cipher -out md.plain
//建立一个共享密钥
$openssl pkeyutl -derive -inkey rsa_pri.pem -passin pass:123456 -peerkey pubkey.pem -out secret
1
2
3
4
5
6
7
8
9
10
2.3 证书类
2.3.1 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]
1
2
3
4
5
6
7
输入输出项,通用选项
-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。
诊断
常常询问如下消息:
Using configuration from /some/path/openssl.cnf
Unable to load config info
在一段时间后跟…
unable to find ‘distinguished_name’ in config
problems making Certificate Request
第一个错误信息是线索:找不到配置文件!某些操做(如检查证书请求)不须要配置文件,所以不会强制使用它。然而生成证书或请求确实须要一个配置文件。这能够被认为是一个bug。
另外一个使人困惑的消息是:
Attributes:
a0:00
当没有属性存在而且该请求包括正确的空的SET OF结构(其DER编码为0xa0×0x00)时显示。若是你只是看到: Attributes:
那么SET OF丢失,编码在技术上是无效的(可是它是容忍的)。有关详细信息,请参阅命令行选项-asn1-kludge的说明。
环境变量
若是定义了变量OPENSSL_CONF,则容许指定备用配置文件,它将被-config选项覆盖(若是存在)。出于兼容性缘由,SSLEAY_CONF环境变量用于相同的用途,但不鼓励使用它。
BUGS
OpenSSL处理T61Strings(又名TeletexStrings)是坏的:它将它们视为ISO-8859-1(拉丁文1),Netscape和MSIE具备类似的行为。若是你须要的字符是PrintableStrings中不可用的字符,而且您不想使用或不能使用BMPStrings,则可能会致使问题。
做为T61String处理的结果,在OpenSSL中惟一正确的表示重音字符的方法是使用BMPString:不幸的是Netscape当前对这些字符进行调整。若是您必须使用Netscape和MSIE重音字符,那么您当前须要使用无效的T61String格式。
目前的提示不是很友好。它不容许您确认您刚刚输入的内容。在配置文件中静态定义了证书请求中的其余扩展。其中一些:像subjectAltName中的电子邮件地址应由用户输入。
例子
//验证证书请求
$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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
2.3.2 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]
1
2
3
4
5
6
7
8
9
输入,输出和通常用途选项
-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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2.3.3 verify
用于验证证书链。
openssl verify [-CApath directory] [-CAfile file] [-purpose purpose] [-policy arg]
[-crl_check] [-crl_check_all] [-policy_check] [-explicit_policy] [-inhibit_any] [-inhibit_map] [-x509_strict][-extended_crl] [-use_deltas] [-policy_print] [-no_alt_chains] [-untrusted file] [-help] [-issuer_checks] [-trusted file] [-verbose] [-] [certificates]
1
2
2.4 PKI
2.4.1 pkcs7
pkcs7处理DER或者PEM格式的pkcs#7文件
openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-out filename]
[-print_certs] [-text] [-noout] [-engine id]
1
2
-inform PEM|DER:输入文件格式
-outform DER|PEM:输出文件格式,DER或者PEM格式。
-in filename:输入的须要处理的文件,默认为标准输入。
-out filename:输出文件,默认为标准输出。
-print:打印出pkcs7的全部信息值。
-print_certs:打印文件中的证书或CRL信息,在一行中打印出持有者和颁发者。
-text:打印证书相关信息。
-noout:不打印证书编码版本信息。
-engine id:指定引擎。
注意:
The PEM PKCS#7 format uses 头部和尾部:
-----BEGIN PKCS7-----
-----END PKCS7-----
1
2
还有一种可兼容的格式:
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
1
2
例子
//把一个PKCS#7文件从PEM格式转换成DER格式:
$openssl pkcs7 -in pk7.pem -outform DER -out pk7.der
//打印文件全部证书
$openssl pkcs7 -in pk7.pem -print_certs -out certs.pem
1
2
3
4
5
2.4.2 pkcs8
pkcs8命令处理PKCS#8格式的私钥。它可使用各类PKCS#5(v1.5和v2.0)和PKCS#12算法来处理未加密的 PrivateKeyInfo格式的和已加密的PrivateKeyInfo格式 的PKCS#8。
openssl pkcs8 [-topk8] [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg]
[-out filename] [-passout arg] [-noiter] [-nocrypt][-nooct] [-embed] [-nsdb] [-v2 alg]
[-v2prf alg] [-v1 alg] [-engine id]
1
2
3
-topk8——默认输入PKCS#8私钥,输出传统格式私钥。使用-topk8选项,状况相反:它读取传统的格式私钥,输出一个PKCS#8格式的密钥。
-inform PEM|DER——输入私钥文件的格式
-outform PEM|DER——输出撕咬的格式
-in filename——输入的私钥文件名
-passin arg——输入私钥口令
-out filename——输出私钥文件名
-passout arg——输出私钥口令
-noiter——MAC保护计算次数为1
-nocrypt——输入或者输出pkcs8默认是加密的,使用此选型不加密
-nooct——此选项以某种软件使用的损坏格式生成RSA私钥。具体来讲,私钥应该包含在OCTET STRING中,可是一些软件只包含结构自己,而不须要周围的OCTET STRING。
-embed——此选项以损坏的格式生成DSA密钥。 DSA参数嵌入在PrivateKey结构中。在这种形式下,OCTET STRING包含一个由两个结构组成的ASN1 SEQUENCE:一个包含参数的SEQUENCE和一个包含私钥的ASN1 INTEGER。
-nsdb—— 此选项用Netscape私钥数据兼容的损坏格式生成DSA密钥。 PrivateKey分别包含由公钥和私钥组成的SEQUENCE。
-v2 alg—— 此选项可使用PKCS#5 v2.0加密算法。一般PKCS#8私钥使用基于口令的加密算法加密,称为pbeWithMD5AndDES-CBC,它使用56位DES加密,是PKCS#5 v1.5中最强大的加密算法。使用-v2选项指定使用PKCS#5 v2.0算法,这可使用任何加密算法,例如168位三重DES或128位RC2,可是尚未不少应用支持PKCS#5 v2.0。若是您只是使用OpenSSL私钥,那么这并不重要。alg参数是要使用的加密算法,有效值包括des,des3和rc2。 建议使用des3。
-v2prf alg—— 此选项将PRF算法设置为与PKCS#5 v2.0一块儿使用。 一个典型的值是hmacWithSHA256。 若是未设置此选项,则使用默认值,若是没有默认值,则使用hmacWithSHA1。
-engine id—— 引擎
-v1 alg——此选项指定要使用的PKCS#5 v1.5或PKCS#12算法。 下面列出了可能的算法的完整列表。
PBE-MD2-DES PBE-MD5-DES——这些算法被包含在原始的PKCS#5 v1.5规范中。他们只提供56位保护,由于它们都使用DES。
PBE-SHA1-RC2-64 PBE-MD2-RC2-64 PBE-MD5-RC2-64 PBE-SHA1-DES——这些算法在原始PKCS#5 v1.5规范中没有说起,可是它们使用相同的密钥导出算法,并被一些软件支持。它们在PKCS#5 v2.0中被说起。它们使用64位RC2或56位DES。
PBE-SHA1-RC4-128 PBE-SHA1-RC4-40 PBE-SHA1-3DES PBE-SHA1-2DES PBE-SHA1-RC2-128 PBE-SHA1-RC2-40——这些算法使用基于PKCS#12密码的加密算法,并容许使用诸如三重DES或128位RC2的强加密算法。
注意
PEM编码PKCS#8文件的加密形式使用以头部和尾部:
—–BEGIN ENCRYPTED PRIVATE KEY—–
—–END ENCRYPTED PRIVATE KEY—–
未加密的使用:
—–BEGIN PRIVATE KEY—–
—–END PRIVATE KEY—–
使用PKCS#5 v2.0算法和高迭代次数加密的私钥比那些使用传统SSLeay兼容格式加密的私钥更安全。所以,若是安全性被认为是重要的,则应转换密钥。
默认加密只有56位,由于这是PKCS#8的大多数当前实现将支持的加密。
某些软件可能使用pkcs#12加密算法的PKCS#8格式私钥:这些是自动处理的,但没有选项生成它们。
能够输出DER编码的PKCS#8格式私钥,由于加密细节包含在ASN1级别,而传统格式包括它们在PEM级别。
标准
来自该PKCS#5 v2.0实现的测试向量使用三重DES,DES和RC2以较高的迭代计数发布到pkcs-tng邮件列表,有几我的确认他们能够解密所生成的私钥,所以能够认为 至少在这些算法方面,PKCS#5 v2.0的实现是至关准确的。
PKCS#8 DSA(和其余)私钥的格式没有很好的记录:它被隐藏在PKCS#11 v2.01,第11.9节。 OpenSSL的默认DSA PKCS#8私钥格式符合本标准。
BUGS
应该有一个选项,打印出使用的加密算法和其余细节,如迭代计数。
PKCS#8使用三重DES和PKCS#5 v2.0应该是OpenSSL的默认私钥格式:为了兼容性,几个实用程序目前使用旧格式。
例子
//pkcs#1私钥生成pkcs8的私钥
$openssl pkcs8 -topk8 -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pri.pk8 -outform PEM -passout pass:123456 -v2 des3
//pkcs8的私钥生成pkcs#1私钥
$openssl pkcs8 -in rsa_pri.pk8 -inform PEM -passin pass:123456 -out rsa_pri.key -outform PEM -passout pass:123456 -v2 des3
1
2
3
4
2.4.3 pkcs12
pkcs12工具,能生成和分析pkcs12,也叫pfx文件。PKCS#12文件能够被用于多个程序,例如包含Netscape、 MSIE 和 MS Outlook。
openssl pkcs12 [-export] [-chain] [-inkey filename] [-certfile filename] [-name name]
[-caname name] [-in filename] [-out filename] [-noout] [-nomacver] [-nocerts] [-clcerts]
[-cacerts] [-nokeys] [-info]
[-des | -des3 | -idea | -aes128 | -aes192 | -aes256| -camellia128 | -camellia192 | -camellia256 | -nodes]
[-noiter] [-maciter | -nomaciter | -nomac][-twopass] [-descert] [-certpbe cipher]
[-keypbe cipher] [-macalg digest] [-keyex] [-keysig] [-password arg] [-passin arg]
[-passout arg] [-rand file(s)][-CAfile file] [-CApath dir] [-CSP name]
1
2
3
4
5
6
7
这里有许多选项,默认状况下pkcs12用于解析pkcs12文件,使用-export选项能够建立一个PKCS#12文件
解析选项
-in filename——指定输入的pkcs12文件,不指定则从标准输入
-out filename——指定输出的证书或私钥文件,不指定则为标准输出,只能时PEM格式
-passin arg——输入的pkcs12文件的口令
-passout arg——输出的口令
-password arg——和-export一块儿使用时等同于 -passout,不然等同于-passin
-noout——禁止在将私钥和证书输出为pkcs12时,显示编码版本信息
-clcerts—— 只输出客户端证书(而不是CA证书)
-cacerts——只输出CA证书(不是客户端证书)。
-nocerts—— 不会输出任何证书。
-nokeys ——不输出私钥。
-info——输出有关PKCS#12文件结构,使用的算法和迭代计数等附加信息。
-des | -des3 | -idea | -aes128 | -aes192 | -aes256| -camellia128 | -camellia192 | -camellia256 输出私钥的加密方式
-nodes——根本不加密私钥。
-nomacver——在读取文件以前,不要尝试验证MAC完整性。
-twopass——提示单独的完整性密码和加密密码:大多数软件老是假定都是同样的,因此这个选项会使这样的PKCS#12文件不可读。
文件建立选项
-export——此选项指定PKCS#12文件将被建立而不是解析。
-out filename—— 这指定将PKCS#12文件输出的文件名。默认使用标准输出。
-in filename——输入的证书和私钥的文件名,默认为标准输入。他们都必须是PEM格式。顺序可有可无,但应有一个私钥及其相应的证书。若是存在其余证书,它们也将被包含在PKCS#12文件中。
-inkey filename——指定读取私钥的文件。若是不存在,则私钥必须存在于输入文件中。
-name friendlyname——这指定了证书和私钥的“友好名称”。该名称一般经过软件导入文件显示在列表框中。
-certfile filename——从其中读取其余证书的文件名。
-caname friendlyname—— 这为其余证书指定了“友好名称”。能够屡次使用此选项以按照它们显示的顺序为全部证书指定名称。 Netscape忽略其余证书上的友好名称,而MSIE显示它们。
-pass arg, -passout arg——输出的pkcs12文件的口令
-passin password——输入的私钥的口令
-chain—— 若是此选项存在,则尝试包括用户证书的整个证书链。标准CA store 用于此搜索。若是搜索失败,则被认为是致命的错误。
-descert——使用三重DES加密证书,这可能会致使PKCS#12文件没法读取某些“导出等级”软件。默认状况下,私钥使用三重DES加密,证书使用40位RC2加密。
-keypbe alg,-certpbe alg——这些选项容许指定加密私钥和证书的算法。可使用任何PKCS#5 v1.5或PKCS#12 PBE算法名称。若是指定了一个密码名称(如list-cipher-algorithms命令的输出),那么它与PKCS#5 v2.0一块儿使用。为了实现互操做性,建议只使用PKCS#12算法。
-keyex|-keysig——指定私钥用于密钥交换或只是签名。 此选项仅由MSIE和相似的MS软件解释。 一般,“出口等级”软件只容许512位RSA密钥用于加密目的,但用于签名的任意长度密钥。 -keysig选项标记仅用于签名的键。 只能签名密钥可用于S / MIME签名,Authenticode(ActiveX控件签名)和SSL客户端身份验证,但只有MSIE 5.0及更高版本的才支持使用仅签名密钥进行SSL客户端身份验证。
-macalg digest—— 指定MAC摘要算法。 默认使用SHA1。
-nomaciter,-noiter——这些选项会影响MAC和密钥算法的迭代次数。除非您但愿生成与MSIE 4.0兼容的文件,不然您应该不使用这些选项。为了阻止经过使用大量经常使用密码的字典来攻击,从密码导出密钥的算法可能会使用迭代计数:这会致使算法的某一部分被重复并减慢。 MAC用于检查文件的完整性,可是因为它一般具备与密钥和证书相同的密码,所以它也可能被攻击。默认状况下,MAC和加密迭代计数都设置为2048,使用这些选项能够将MAC和加密迭代计数设置为1,这将减小文件的安全性,除非您真的必须使用这些选项。大多数软件支持MAC和密钥迭代计数。 MSIE 4.0不支持MAC迭代计数,所以须要-nomaciter选项。
-maciter——此选项以是为了与之前的版本兼容,之前须要使用MAC迭代计数,但如今默认状况下它们已被使用。
-nomac——不要尝试提供MAC完整性。
-rand file(s)——指定随机数种子文件,或者EGD套接字的随机数据的文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其余系统用“:”
-CAfile file—— CA存储为文件。
-CApath dir——CA存储为目录。此目录必须是标准证书目录:这是每一个主题名称的哈希(使用x509 -hash)应连接到每一个证书。
-CSP name——将名称写为Microsoft CSP名称。
注意
虽然有不少选项,但大多数选项不多使用。对于仅PKCS#12文件解析,-in和-out须要用使用,对于PKCS#12文件建立,-export和-name也要使用。
若是不存在-cacerts,-cacerts或-nocerts选项,则全部证书将按照它们在输入PKCS#12文件中显示的顺序输出。不能保证第一个证书是与私钥对应的证书。某些软件须要私钥和证书并假定文件中第一个证书是与私钥相对应:这可能并不是老是如此。使用-clcerts选项将经过仅输出与私钥对应的证书来解决此问题。若是须要CA证书,则可使用-nokeys -cacerts选项将其输出到单独的文件,以便输出CA证书。
-keypbe和-certpbe算法容许指定私钥和证书的精确加密算法。 一般,默认值是正常的,可是偶尔软件不能处理三重DES加密的私钥,那么选项-keypbe PBE-SHA1-RC2-40能够用于将私钥加密减小到40位RC2。 全部算法的完整描述包含在pkcs8手册页中。
BUGS
有些人会认为PKCS#12标准是一个大错误
在0.9.6a以前的OpenSSL版本在PKCS#12密钥生成中有错误。在极少的状况下,这可能会产生一个使用无效密钥加密的PKCS#12文件。所以,一些从其余应用(MSIE或Netscape)触发这个错误的PKCS#12文件没法被OpenSSL解密,而且OpenSSL也可能产生不能被其余应用解密的PKCS#12文件。生成这样的文件的机会相对较小:256个不到1个。
修复这个错误的反作用是任何旧的无效加密的PKCS#12文件不能再被固定版本解析。在这种状况下,pkcs12实用程序会报告MAC是否正常,可是在提取私钥时会出现解密错误。
经过使用较早版本的OpenSSL从PKCS#12文件中提取私钥和证书,并使用较新版本的OpenSSL从密钥和证书中从新建立PKCS#12文件,能够解决此问题。例如:
old-openssl -in bad.p12 -out keycerts.pem
openssl -in keycerts.pem -export -name“个人PKCS#12文件”-out fixed.p12
1
2
例子
$openssl pkcs12
1
2.5 工具类
2.5.1 smime
smime命令处理S / MIME邮件。它能够加密,解密,签名和验证S / MIME消息
openssl smime [-encrypt] [-decrypt] [-sign] [-resign] [-verify] [-pk7out] [-[cipher]] [-in file] [-no_alt_chains] [-certfile file] [-signer file] [-recip file] [-inform SMIME|PEM|DER] [-passin arg] [-inkey file] [-out file] [-outform SMIME|PEM|DER] [-content file] [-to addr] [-from ad] [-subject s] [-text] [-indef] [-noindef] [-stream] [-rand file(s)] [-md digest] [cert.pem]...12345命令选项——有六个操做选项能够设置要执行的操做类型。其余选项的含义因操做类型而异 -encrypt—— 加密指定收件人证书的邮件。输入文件是要加密的消息。输出文件是MIME格式的加密邮件。-decrypt—— 使用提供的证书和私钥解密邮件。输入文件的是MIME格式的加密邮件消息。解密的邮件被写入到输出文件。-sign——使用提供的证书和私钥签名。输入文件是要签名的消息。 MIME格式的签名消息将写入到输出文件。-verify——验证签名邮件。指望输入的签名邮件消息并输出签名数据。支持明文和不透明签名。-pk7out——输入消息并写出PEM编码的PKCS#7结构。-resign——利用已有的消息或者一个或多个签名者从新签名。-in filename——要加密或签名的输入消息或要解密或验证的MIME消息。-inform SMIME|PEM|DER——这指定了PKCS#7结构的输入格式。默认值为SMIME,它读取S / MIME格式的消息。 指定PEM和DER以读取PEM和DER格式PKCS#7结构。这当前只影响PKCS#7结构的输入格式,若是没有输入PKCS#7结构(例如使用-encrypt或-sign),则此选项不起做用。-out filename——输出的已解密或验证的消息文本或已签名或加密的MIME格式消息。-outform SMIME|PEM|DER—— 这指定了PKCS#7结构的输出格式。默认是SMIME,它写入一个S / MIME格式的消息。 PEM和DER格式更改成输出PEM和DER格式PKCS#7结构。这当前只影响PKCS#7结构的输出格式,若是没有输出PKCS#7结构(例如使用-verify或-decrypt),则此选项不起做用。-stream -indef ——-stream和-indef选项是等效的,启用用于编码操做的流I / O。这容许数据的单次处理,而不须要将整个内容保存在内存中,可支持很是大的文件。若是输出格式为SMIME,则默认状况下,全部其余操做都关闭流,S / MIME签名将自动设置为流。-noindef——在产生不定长度构造的编码时禁用流IO。 此选项目前无效。 在未来流式传输将在全部相关操做上默认启用,此选项将禁用它。-content filename—— 这指定一个包含分离的内容的文件,这仅对-verify命令有用。 这仅在PKCS#7结构使用不包含内容的分离签名格式才可用。 若是输入格式为S / MIME,则此选项将覆盖任何内容,并使用多部分/已签名的MIME内容类型。-text—— 若是加密或签名,此选项会将明文的(文本/纯文本)MIME头部添加到提供的消息中。 若是解密或验证它剥离明文头部:若是解密或已验证的消息不是MIME类型text / plain,则会发生错误。-CAfile file—— 包含受信任的CA证书的文件,仅与-verify一块儿使用。-CApath dir—— 包含受信任的CA证书的目录,仅与-verify一块儿使用。此目录必须是标准证书目录:这是每一个主题名称的哈希(使用x509 -hash)应连接到每一个证书。-md digest——在签名或辞职时使用的摘要算法。若是不存在,那么将使用默认摘要算法签名(一般是SHA1)。-[cipher]——使用加密算法。例如,DES(56位) -des,三重DES(168位)-des3,EVP_get_cipherbyname()函数)也能够在破折号以前使用,例如-aes_128_cbc。请参阅OpenSSL支持的密码列表。若是未指定,则使用三重DES。仅用于-encrypt。-nointern—— 当验证消息时,一般将搜索包含在消息中的签名证书。使用此选项,只会使用-certfile选项中指定的证书。可是,提供的证书仍然能够用做不可信CA。-noverify—— 不要验证签名信息的签名者证书。-nochain——不要对签名者证书进行证书链验证:不要将签名的邮件中的证书做不可信CAs。-nosigs——不要尝试验证邮件上的签名。-nocerts——当签名的时候不包含签名者的证书信息值,默认是要包含的,这将减小签名消息的大小,但验证者必须具备本地可用的签名者证书的副本(例如使用-certfile选项传递)。-noattr——一般当消息被签名时,应包括一组属性,其中有签名时间和支持的对称算法。使用此选项,它们不包括在内。-binary——一般,输入消息被转换为“规范”格式,其按照S / MIME规范的要求使用CR和LF做为行尾。当此选项存在时,不会发生转换。这在处理可能不是MIME格式的二进制数据时颇有用。-nodetach——签名时使用不透明的签名:此格式更能抵抗邮件中继的翻译,但不能由不支持S / MIME的邮件代理读取。若是没有此选项,则使用MIME类型multipart / signed进行明文签名。-certfile file——容许指定其余证书。当签名这些证书将包含在消息中。当验证这些将搜索签署者证书。证书应采用PEM格式。-signer file——在签名或者从新签名时的签名证书,若是须要多个签名者,该选项能够屡次使用。 若是正在验证消息,则验证成功后,签名者证书将被写入该文件。-recip file——解密消息时的收件人证书。 此证书必须与消息的一个收件人匹配,不然发生错误。-inkey file—— 签名或解密时使用的私钥。 这必须匹配相应的证书。 若是未指定此选项,则私钥必须包含在使用-recip或-signer文件指定的证书文件中。 签名时,能够屡次使用此选项来指定连续的私钥。-passin arg——私钥口令-rand file(s)——指定随机数种子文件,或者EGD套接字的随机数据的文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其余系统用“:”cert.pem…——一个或多个邮件收件人证书:在加密邮件时使用。-to, -from, -subject——相关邮件标题。 这些包含在消息的签名部分以外,能够手动包含它们。 若是签名,那么许多S / MIME邮件客户端会检查签名者证书的电子邮件地址是否匹配,在From:address中指定。-purpose, -ignore_critical, -issuer_checks, -crl_check, -crl_check_all, -policy_check, -extended_crl, -x509_strict, -policy -check_ss_sig -no_alt_chains——设置证书链验证的各类选项。 详见验证手册页。注意 发送MIME消息必须在标头和输出之间没有任何空白行。某些邮件程序会自动添加一个空行。将邮件直接发送到sendmail是实现正确格式的一种方式。提供的要签名或加密的消息必须包含必需的MIME头部,不然许多S / MIME客户端不会正确显示(若是有的话)。您可使用-text选项自动添加纯文本标题。“签名而且加密”消息是一个已签名且被加密的消息。这能够经过加密已经签名的消息来生成:参见示例部分。该版本的程序只容许每一个消息一个签名者,但它将验证接收到的消息的多个签名者。某些S / MIME客户端若是消息包含多个签名者,则会阻塞。经过签名已经签名的消息能够并行地签署消息。选项-encrypt和-decrypt反映S / MIME客户端中的常见用法。严格来讲,者用于处理PKCS#7信封数据:PKCS#7加密数据用于其余目的。-resign选项在添加新签名者时使用现有的消息摘要。这意味着属性至少必须存在于使用相同消息摘要的一个现有签名者中,不然此操做将失败。-stream和-indef选项支持实验流I / O支持。所以,编码是使用不肯定长度构造的BER编码而再也不是DER。若是内容未分离,则-encrypt操做和-sign操做支持流式传输。Streaming始终用于具备分离数据的-sign操做,可是内容再也不是PKCS#7结构的一部分,而编码仍然是DER。退出代码 0——操做彻底成功。1——解析命令选项发生错误。2——其中一个输入文件没法读取。3——建立PKCS#7文件或读取MIME消息时发生错误。4——解密或验证消息时发生错误。5——消息已正确验证,但写入签名者证书时出现错误。bug MIME解析器不是很聪明:它彷佛处理了我抛出的大多数消息,但它可能会阻碍别人。当前只会将签名者的证书写入文件:若是签名者具备单独的加密证书,则必须手动提取。理想状况下,应保留每一个电子邮件地址的证书的数据库代码当前没有注意SMIMECapabilities signed属性中提供的容许的对称加密算法。 这意味着用户必须手动包括正确的加密算法。 它应该将容许的密码列表存储在数据库中,并使用它们。签名人的证书不进行吊销检查。当前的代码只能处理S / MIME v2消息,更复杂的S / MIME v3结构可能会致使解析错误。例子1 声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我本身所作的工做主要是针对新的1.0.2版本进行验证,修改错别字,和错误,从新排版,以及整理分类,配图。 未经做者容许,严禁用于商业出版,不然追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!--------------------- 原文连接:https://blog.csdn.net/liao20081228/article/details/77159039