密码学基础(四):OpenSSL命令详解

7,417 阅读20分钟

openssl介绍

密码学标准和我们平常所见的互联网协议一样,是一种大家都遵守的约定和标准,比如PKCS#1中规定了 RSA 秘钥时怎么生成的,公私钥的格式等内容,x509标准规定了证书的格式等。

OpenSSL 本质就是一个工具集,按照主流的密码学标准实现了常用的加密算法,证书的生成、签名、验签等功能。

因为网络上的资料比较杂,有的是一些比较老的版本,有的又不完整,所以自己稍加总结,方便以后重新查阅。而学习 OpenSSL 的目的只是为了加深对密码学基础内容的理解和一些知识点的验证,不是密码学的开发人员暂时不需要去研究 OpenSSL 源码,有这功夫还不如多补补算法、C/C++、编译原理、数据结构等底层知识,所以本文只会建立 OpenSSL 大概的使用框架以及主流功能,完整的功能及其溯源不再本文讨论范围。

本文将分三类讲述 OpenSSL 指令的使用,其中也只讲解常用的指令:dgst、enc、rsa指令集合、req、x509、pkcs12。CA 指令因为在平时较少使用,暂不研究。

非对称加密

OpenSSL 一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名, 这里主要演示 RSA 算法,需要使用DH算法的可以自行研究 pkey 指令集合。

  • genrsa指令

genrsa指令虽然已经被功能更加全面的genpkey指令取代,但是因为其相对简单,功能纯粹,可以作为学习genpkey的基础。另外,genpkey 中的一些更详细的功能在现阶段使用不到,使用genrsa直接生成私钥相对简单方便,容易掌握。其可选参数如下:

usage: genrsa [args] [numbits]
 -out file       output the key to 'file'(输出的文件名)
 -passout arg    output file pass phrase source(给输出的文件设置密码,此处不同于对称算法加密,对称算法是对私钥结果进行加密,这里是对文件加密)
 -f4             use F4 (0x10001) for the E value(使用65537作为E的值,E在RSA算法中使用场景为:1<e<φ(n) ,默认)
 -3              use 3 for the E value(使用3作为E的值,非默认)

// 以下为对称加密选项
-des            encrypt the generated key with DES in cbc mode
-des3           encrypt the generated key with DES in ede cbc mode (168 bit key)
-aes128, -aes192, -aes256
                 encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
                 encrypt PEM output with cbc camellia

genrsa接两个参数,第一个选项参数,第二个为rsa算法中的m值的长度,一般为1024,更高安全级别的位2048。其中,如果不设置对称加密的算法,则不会对私钥结果进行加密,如果不为空,则会要求输入对称算法中将要使用的秘钥,使用如下:

1、生成私钥

openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
..............++++++
...............................++++++
e is 65537 (0x10001)

得到的结果为:

私钥

2、生成私钥并使用对称算法对秘钥进行加密

openssl genrsa -aes128 -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
....................................................++++++
.................++++++
e is 65537 (0x10001)
Enter pass phrase for private.pem:123456
Verifying - Enter pass phrase for private.pem:123456

结果:

ase加密之后的私钥

  • rsa指令

rsa功能比较多,可以对秘钥进行管理。其中最主要的功能就是从私钥中提取公钥、查看秘钥的结构信息,可以使用-help查看:

usage: rsa [options]

 -check             检测秘钥合法性
 -in file           输入的文件名
 -inform format    输入文件的格式 (DER, NET or PEM (default))
 -modulus           打印 RSA 秘钥的modulus
 -out file          输出的文件名
 -outform format    输出文件的格式(DER, NET or PEM (default PEM))
 -passin src        输入文件的密码
 -passout src       输出文件的密码
 -pubin             该指令说明输入的是公钥,默认为私钥
 -pubout            该指令说明需要输出公钥,默认输出私钥
 -sgckey            what it is?
 -text              打印信息

其中,ciphername可选值有-AES-192-CBC等等,可以通过-help指令查看,此处不再列出。主要功能演示如下:

1、查看秘钥信息

openssl rsa -in private.pem -text

结果:

查看秘钥信息

2、从私钥中提取公钥

openssl rsa -in private.pem -pubout -out public.pem

3、给秘钥添加/去除/修改对称加密的密码

// 为RSA密钥增加口令保护
openssl rsa -in RSA.pem -des3 -passout pass:123456 -out E_RSA.pem

// 为RSA密钥去除口令保护
openssl rsa -in E_RSA.pem -passin pass:123456 -out P_RSA.pem

// 修改加密算法为aes128,口令是123456
openssl rsa -in RSA.pem -passin pass:123456 -aes128 -passout pass:123456 -out E_RSA.pem

4、转换秘钥格式

// 把pem格式转化成der格式,使用outform指定der格式
openssl rsa -in RSA.pem -passin pass:123456 -des -passout pass:123456 -outform der -out rsa.der
  • rsautl指令

以上两个指令时生成和管理秘钥,而rsautl指令则和秘钥的具体使用有关,也就是如何使用 rsa 秘钥进行加密解密操作。

Usage: rsautl [options]
// 输入文件(被加密/解密/签名)和输出文件
-in file        被操作的文件
-out file       操作完成后的输出文件

// 输入的秘钥
-inkey file     完成操作时使用到的秘钥

// 集中填充方式
-ssl            use SSL v2 padding
-raw            use no padding
-pkcs           use PKCS#1 v1.5 padding (default)
-oaep           use PKCS#1 OAEP

// 几种功能选项
-sign           使用私钥签名
-verify         使用公钥验签
-encrypt        使用公钥加密,注意是公钥加密
-decrypt        使用私钥解密,注意是私钥解密
-passin arg    如果秘钥被对称加密过,则使用该选项提供对称加密所使用的秘钥

// 其他
-keyform arg    说明私钥格式,默认PEM
-pubin          说明输入的是公钥
-certin         输入的是携带rsa公钥的证书
-hexdump        16进制输出

1、使用公钥加密

注意,OpenSSL 中的rsautl指令和pkeyutl指令都只能使用私钥解密,但是公钥和私钥都能用于加密。

也就是说使用私钥加密时需要用私钥解密,使用公钥加密后仍然需要使用私钥解密。猜测可能的原因是私钥可以提取公钥,所以使用私钥加密后会先分理处公钥,再使用公钥加密?先这么理解吧,要彻底搞清楚估计要学习加密标准及其实现了,指令如下:

openssl rsautl -encrypt -in plain.text -inkey public.pem -out encrypt.text 

备注: 为什么相同的明文,使用密钥加密后,每次密文结果不一样?因为 RSA 加密的时候根据填充模式填充随机数,导致每次加密结果不同。

2、使用私钥解密

openssl rsautl -decrypt -in encrypt.text -inkey private.pem -out replain.text

3、使用私钥签名

openssl rsautl -sign -in plain.text -inkey private.pem -out signed.text

4、使用公钥验签

验签的时候需要使用-pubin告知输入的秘钥为公钥

openssl rsautl -verify -in signed.text -pubin -inkey public.pem -out verify.text

摘要算法

摘要算法常用于数字签名,数字签名严格意义上来讲分为两步:生成摘要和签名。首先使用摘要算法对原文计算摘要,然后使用签名者的私钥对摘要进行签名。

openssl中的哈希函数加密主要使用命令dgst,也可以直接使用对应算法指令,比如md5,可以直接使用-help来查看选项(实际上是瞎输入一个不存在的option来被动弹出提示)。然而,因为openssl版本的原因,导致命令乱七八糟,比如md5指令还可以指定其他的算法类型,这就很蛋疼了。

总之就记住一条,只是用dgst指令来加密即可,其使用场景有三个:

1、计算摘要

计算摘要的格式如下:

openssl dgst [算法名称] [需要计算摘要的文件] 

其中算法可供选择的有:-md4、-md5、-ripemd160、-sha、-sha1、-sha224、-sha256、-sha512、-sha384、-wirlpool等等可以通过openssl dgst -help命令查看

举个栗子🌰:

// 进入到对应的文件夹中
cd /Users/caoxk/Demo/opensslTest 
// 使用sha1算法对plain.text文件进行摘要计算,其中plain.text中的内容为123456
openssl dgst -sha1 plain.text 

结果:

SHA1(plain.text)= 7c4a8d09ca3762af61e59520943dc26494f8941b

和在线加密的结果对比:

sha1哈希123456

2、使用私钥签名

仍然遵循 dgst [指令] [文件名]的格式

// 使用默认md5对plain.text进行哈希,然后使用private.pem私钥对哈希值进行签名后以16进制输出到test.text文件中
openssl dgst -sign private.pem -hex -out test.text plain.text

结果:

dgst签名

3、使用公钥验证签名

openssl dgst -verify public.pem -signature test.text plain.text 

结果:

Verified OK

备注 使用hex输出后验证会失败,hex指令只是用于展示,真正使用中需要将hex去掉,同理,rsa中的-hexdump指令也是如此。

对称加密

OpenSSL一共提供了8种对称加密算法,且支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。这里以AES128的ECB模式做演示。

enc 指令参数如下:

usage: enc -ciphername [-AadePp] [-base64] [-bufsize number] [-debug]
    [-in file] [-iv IV] [-K key] [-k password]
    [-kfile file] [-md digest] [-none] [-nopad] [-nosalt]
    [-out file] [-pass arg] [-S salt] [-salt]

 -a/-base64                 使用base64输出/解密
 -d                 解密
 -e                 加密(默认)
 -debug             打印出debug输出
 -in file           需要加密/解密的文件
 -iv IV             偏移量,ECB模式下不需要
 -K key            对称加密中使用到的秘钥,如果不使用-k,则会要求从键盘输入
 -out file          输出文件
 -p                打印
 -salt             该选项为默认值,意思是默认会随机加盐,使用-nosalt取消加盐
-S                 手动指定加盐的值

enc中默认会对key进行加盐操作,所以和在线 aes 加密的结果肯定会不同。可以使用 -S 手动指定盐的值,但是具体的加盐算法是什么,不得而知,请高手指正。

// 使用aes-128算法,以ecb模式,对秘钥123进行默认加盐操作后,对plain.text进行对称加密,结果输出到 result.text 中
openssl enc -e -aes-128-ecb -in plain.text -p -k 123 -a  -out result.text
// 盐
salt=EF3004BF880585F5
// 加盐之后的key
key=32BDF1964B275BF4F7A344D066E3A23E
// 加密后的base64结果值
U2FsdGVkX1/vMAS/iAWF9XW23uJDpttgH/3J0n18R30=

解密:

openssl enc -d -aes-128-ecb -in result.text -p -k 123 -a
// 盐的信息已经包含在了result.text文件中,不需要再次输入
salt=041C31BA86CA7D29
key=DED2653F37157BC56C7D52919D6FF828
123456

新的非对称加密指令

openssl更新之后有一个pkey系列的三个指令genpkeypkeypkeyutl,和原先的genrsarsarsautl一一对应。

新的指令集只是在原油基础上对功能进行了合并和扩展,所以这些指令不作为本文重点,具体使用可以在openssl genpkey -help中查看,这里只演示最常使用的几个指令:

1、genpkey生成私钥

// 使用随机数长度为1024的rsa算法生成pem格式的私钥并输出到rsa_pri.key文件中,且在文件中打印私钥/公钥参数/结构的文本
openssl genpkey -out rsa_pri.key -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:1024  -text

结果:

genpkey生成私钥

2、pkey从私钥中提取公钥

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

-in file       输入文件,如果没有则标准输入
-inform X       输入的格式
-passin arg     输入文件的密码
-outform X      输出格式(DER/PEM)
-out file       输出的文件,如果没有则标准输出
-passout arg    输出文件加密所使用的密码
-pubin    默认是读入私钥,该选项指定读入公钥
-pubout    默认情况下会输出私钥,使用此选项将会
输出公钥,用于从私钥生成公钥
-text    打印公私钥结构信息

从私钥中提取公钥:

openssl pkey -in private.pem -pubout -out public.pem

结果:

私钥提取公钥

3、pkeyutl 加密解密

// 公钥加密
openssl pkeyutl -encrypt -in plain.text -inkey public.pem -out encrypt.text

// 私钥解密
openssl pkeyutl -decrypt -in encrypt.text -inkey private.pem -out decrypt.text

4、pkeyutl 签名和验签

openssl pkeyutl -sign -in plain.text -inkey private.pem -out signed.text

openssl pkeyutl -verify -pubin -inkey public.pem -in plain.text -sigfile signed.text  -out verify.text

证书类

证书的格式相关的密码学标准是PKCS#10,标准中规定了CSR 文件的格式,req指令就是基于该标准,实现了 CSR 文件的生成、查看、验证、自签名等功能。

  • req指令

req的使用方法为:req [options] <infile >outfile,其选项有:

[new/x509]

当使用-new选取的时候,说明是要生成证书请求,当使用x509选项的时候,说明是要生成自签名证书。

[/key/newkey/keyout]

key和newkey是互斥的,key是指定已有的密钥文件,而newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,然后生成的密钥名称有keyout参数指定。

当指定newkey选项时,后面指定rsa:bits说明产生rsa密钥,位数由bits指定。指定dsa:file说明产生dsa密钥,file是指生成dsa密钥的参数文件(由dsaparam生成)

[in/out/inform/outform/keyform]

in选项指定证书请求文件,当查看证书请求内容或者生成自签名证书的时候使用

out选项指定证书请求或者自签名证书文件名,或者公钥文件名(当使用pubkey选项时用到),以及其他一些输出信息。

inform、outform、keyform分别指定了in、out、key选项指定的文件格式,默认是PEM格式。

[pubkey/noout/text/默认]
text打印请求文件中的所有信息(不包含公钥),pubkey提取出 csr 文件中的公钥,noout不输出 csr 文件中的 request 内容。默认只打印 request 内容。

除上述主要参数外,还有许多其他的参数,不在一一叙述,有兴趣的读者可以查看req的man手册

1、生成csr文件

使用private.pem私钥生成csr文件并输出,期间会要求输入个人信息

openssl req -new -key private.pem -out request.csr

使用原有的RSA密钥生成证书请求文件,指定-batch选项,不询问申请者的信息。主体信息由命令行subj指定,且输出公钥

openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet -pubkey

自动生成1024位RSA密钥,并生成证书请求文件,指定-nodes文件,密钥文件不加密

openssl req -new -newkey rsa:1024 -out client.pem -keyout RSA.pem -subj /C=AU/ST=Some-State/O=Internet -nodes

2、查看/验证csr文件

默认只会输出 csr 内容,-text输出包含 csr 内容的所有结构,-noout不输出 csr内容

openssl req -in request.csr -noout -text

结果:

req查看csr文件内容

3、提取 csr 文件中的公钥

openssl req -in request.csr -pubkey

结果:

csr提取公钥

4、生成自签名证书

-x509需要三个参数:证书请求文件 csr 、证书签名用到的私钥、证书输出文件

// 使用private.pem 私钥对request.csr的证书请求文件进行签名并输出
openssl req -x509 -in request.csr -out client.cer -key private.pem 

结果:

自签名证书

查看证书内容则在下一个指令x509中讲解。

  • x509指令

OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。

事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。

该指令功能丰富,可以查看证书信息、作为一个伪 CA 机构给证书签名(和req -x509指令一样)、证书格式转换等。因为功能是在太多,这里只介绍最主要和常用的功能:

1、查看证书文件信息

// 查看证书格式为DER的Apple.cer文件中的信息,默认证书为PEM格式
openssl x509 -in Apple.cer -text -inform DER

结果:

证书信息查看

2、查看证书中的公钥

// 只打印证书中的公钥,不打印证书
openssl x509 -in ios_development.cer -inform DER -pubkey -noout

3、转换证书格式

openssl x509 -in apple.cer -inform DER -out cert.pem -outform PEM

4、给 csr 文件签名

req -x509是相同的,这里不再赘述。

  • PKCS12指令

PKCS#标准有1-15个,具体的内容可以去网络上查阅,后文也会对密码学的一些主流标准进行简析。OpenSSL 就是参照这些标准实现了一些使用的功能。

PKCS#12标准定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。p12 文件则是个人秘钥文件,可以只包含私钥,也可以包含证书和私钥。一般用于用户在不同设备间移动他们的个人身份信息。

在iOS中,开发者通过自己的私钥生成 csr 文件之后在 apple 官网生成并下载了证书,这个证书只有自己能使用,其他人因为没有证书对应的私钥,所以是不能使用的。于是乎就有了把p12文件共享给别人,其他人在自己电脑上安装私钥之后就可以使用对应的证书对代码进行签名了。但是貌似新的版本上已经不需要共享p12文件了,这个有时间可以去验证下结果并探索下原理。

常用功能如下:

1、从p12文件中提取私钥

注意,一定要加-nodes,否则默认会要求输入加密密码对私钥进行加密

openssl pkcs12 -in caoxk1107-private.p12 -out private.pem -nodes

不输入-nodes:

caoxkdeMacBook-Pro:opensslTest caoxk$ openssl pkcs12 -in caoxk1107-private.p12 -out private.pem
// 要求输入p12文件的密码
Enter Import Password:
MAC verified OK
// 要求输入加密导出的PEM文件的密码
Enter PEM pass phrase:
caoxkdeMacBook-Pro:opensslTest caoxk$ 

结果:

不输入-nodes

输入-nodes:

caoxkdeMacBook-Pro:opensslTest caoxk$ openssl pkcs12 -in caoxk1107-private.p12 -out private.pem -nodes
// 只要求输入p12文件的密码
Enter Import Password:
MAC verified OK
caoxkdeMacBook-Pro:opensslTest caoxk$ 

结果:

从p12中导出私钥

2、将证书和私钥合成p12文件

openssl pkcs12 -export -in alicecert.pem -inkey alicekey.pem -certfile cacert.pem -out alice.p12 

3、查看p12文件

之前的指令中一般使用-text来进行信息的查看,在pkcs12指令中,使用-info来查看 p12 文件的内容,需要注意的是,仍然记得带上-nodes,否则私钥会被加密,不予展示。

查看创建 csr 文件时,从私钥中导出的p12文件:

 openssl pkcs12 -in caoxk1107-private.p12 -nodes -info

结果:

MAC Iteration 1
MAC verified OK
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    friendlyName: caoxk1107
    localKeyID: 17 E6 1A 74 F3 38 00 05 46 B4 B1 42 18 1A FC 34 9B AB DB 08 
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDRaMHFhRycODXw
D7JBQ8N/JbN/PeXEqLuvXNa9MtCvAf2lhsm90dwyUyfiLcWVHO1Xz2SmySAC3Rpw
6h0XRpGSGCDl7jqx9yFkZwTw/cVco0K4iP473aa+3+x7CboTyrgKEKP+uwEVZINO
/zGIf9QAg2F9dV1A3jxzZYmWvAzmfWq62n76gqUN2Fs0TDFBV0bFUNuw0SUZQpXQ
Ex/j18kGCps+Y8ab0sVy9O+shKUYjdhURwniXJkHI2T0SYMHg844KshWh8FMit74
s7cUkgdPQd09Ubj7oBGN/XfcysMx5tgevXXhw9yqZLv+2dFEVzn6NKvxg7HNBY3u
r/a37fPTAgMBAAECggEAElQA4bDM2D9zORemml+79JzwIOrh+VxrUOXnRZf0+9xI
vvwVHDAJ/b2ZeApZiLuHanAUdySTUKzZa5iSAz+B7i9+caFwMbNXkNoTbKRJadpA
NLaIyeSUe5BNulcXmjPb98WNFPZ5Gc46T+e2BiRqAcF9/uUOzGanE9KHQFIlLucS
riBfYyvJw1S/AVoHvlBk6wldvnB5IRdcHHBdl+bLofBTxkDXcLDikhttxps9ix3P
YecuPEs5TkBiredYO9tJKCPYkcz2rdBioQHCRBsx3LInVzkVHEHrVLBbt9T3wgBA
IA+pliuUeVV/HeelqLGMwYQBlCmSxiZ5/gKF8zQ6wQKBgQDss5BaBg89sP68Rr6J
ba4j72pThoaeO+kYPGNeWKz9zhT3phf81NjxQ/THuJTPJ0bWhoKz58/HP1LTL9W1
lsihU7VNa7kVqOteWTDNkli087Kes5iqoWJVdLrJv2Tn+4EXltX0L5Musquord7v
3AE6dar9aleDzEp0wFr/x7wv5wKBgQDie4yqVLXzXOqnlPXdAsjEx7IC/ysgUsuD
HrvOBzjq9nGilk4IjGgCdzZujn3A80UcPN8boCcrVSDc0qTM8MCqD8t+8yEgRLD6
UA1MgUQfqZKictpsuwsNkQ/2OqUSPkCGUaSqfucCuYJtfxf/vbRfEYkvxShMuI1j
9bewWFqPNQKBgQCgeAOu5FjEzA+GeLeH19GtDwyYX6U39QnLonUDaz6sOmBAnFu6
zlndBuMV228XGVuO6FYHvWpBfA6cmdtaZkTSCjvpptQteP1IU1Mgqsx0sJoxuTQQ
yaQupxpS1+yC0SDtaxbVmsM/b2Wsz2NKXW5/wXIQp115PrBjglyu9yv/lQKBgAaD
oTcg+p7GVGV/jlbOBrJKQB9/8WCboQjjcGlrocJ4VipkAliSmUdA4IrrhEhxdtJq
Gcy0nYvMhgZz9JOEdTYvAB5lpdVExIZemRNTQH9cpEAR56Bq/NVmD7x4UVkl+zsh
zAevYLueVFcL6cfMUAzP908tb4xNXpu6bI8g63HlAoGAQNEzqSzVoLDpeeMUbo5y
OtCcT5p4Rin8VBG/izUFo6vXfeDcQU/VDaegDDokEvrPIGymxu1CHIfqF+E81KrK
cY/YmTkk9q6/jzFfJVQIZ29Y40kPBnEeWc1ij/H0ImwsUmKyvOh2Bq9wiFx4RHw+
LnXrKAC9CEnvZUmpam41UQ0=
-----END PRIVATE KEY-----

查看经由钥匙串中的证书导出的p12文件

openssl pkcs12 -in privateKeyFromKeychain.p12 -info -nodes

结果:

PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    friendlyName: iPhone Developer: yue hu (ZJ7BM73MA2)
    localKeyID: 17 E6 1A 74 F3 38 00 05 46 B4 B1 42 18 1A FC 34 9B AB DB 08 
subject=/UID=JUNRCFGNSU/CN=iPhone Developer: yue hu (ZJ7BM73MA2)/OU=3BFC8YW44Z/O=Wuhan New World Jewelry Co., Ltd./C=US
issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
-----BEGIN CERTIFICATE-----
MIIFpzCCBI+gAwIBAgIIKFFF+H2MnPUwDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js
ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3
aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
HhcNMTkxMTA3MDYyNTAwWhcNMjAxMTA2MDYyNTAwWjCBmjEaMBgGCgmSJomT8ixk
AQEMCkpVTlJDRkdOU1UxLjAsBgNVBAMMJWlQaG9uZSBEZXZlbG9wZXI6IHl1ZSBo
dSAoWko3Qk03M01BMikxEzARBgNVBAsMCjNCRkM4WVc0NFoxKjAoBgNVBAoMIVd1
aGFuIE5ldyBXb3JsZCBKZXdlbHJ5IENvLiwgTHRkLjELMAkGA1UEBhMCVVMwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRaMHFhRycODXwD7JBQ8N/JbN/
PeXEqLuvXNa9MtCvAf2lhsm90dwyUyfiLcWVHO1Xz2SmySAC3Rpw6h0XRpGSGCDl
7jqx9yFkZwTw/cVco0K4iP473aa+3+x7CboTyrgKEKP+uwEVZINO/zGIf9QAg2F9
dV1A3jxzZYmWvAzmfWq62n76gqUN2Fs0TDFBV0bFUNuw0SUZQpXQEx/j18kGCps+
Y8ab0sVy9O+shKUYjdhURwniXJkHI2T0SYMHg844KshWh8FMit74s7cUkgdPQd09
Ubj7oBGN/XfcysMx5tgevXXhw9yqZLv+2dFEVzn6NKvxg7HNBY3ur/a37fPTAgMB
AAGjggHxMIIB7TAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFIgnFwmpthhgi+zr
uvZHWcVSVKO3MD8GCCsGAQUFBwEBBDMwMTAvBggrBgEFBQcwAYYjaHR0cDovL29j
c3AuYXBwbGUuY29tL29jc3AwMy13d2RyMDEwggEdBgNVHSAEggEUMIIBEDCCAQwG
CSqGSIb3Y2QFATCB/jCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlz
IGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2Yg
dGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9u
cyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBw
cmFjdGljZSBzdGF0ZW1lbnRzLjA2BggrBgEFBQcCARYqaHR0cDovL3d3dy5hcHBs
ZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMBYGA1UdJQEB/wQMMAoGCCsGAQUF
BwMDMB0GA1UdDgQWBBQX5hp08zgABUa0sUIYGvw0m6vbCDAOBgNVHQ8BAf8EBAMC
B4AwEwYKKoZIhvdjZAYBAgEB/wQCBQAwDQYJKoZIhvcNAQELBQADggEBAFM9T1dB
P5JXQ6cj9QOgLWaIBfdo3WRT/H3ZXBmaIuJVCjlAbK1QORQt3xBgGoqp68fPC6rl
Z/jikrgNuVFt1bsRxM60xkhBMbYKSlGU4SuwJK7vjH5/z1VcEqiep0MRNnFzruih
gahBWFYUhSJ4R87SoszIULxwF8xzZHMqcZgrOkydOSIMhKLgDOGOj80wpvnj/uDP
Mo8EUr1zaIS+T0BBWdnOV5gp7ZOzTT2ws/h0SI79sxVwesUAw8S0d1WjazsiCvSm
MGbHD3lW+3l+4O334l5CKfTSa9HzUMGazio+6GZ3D8KKgW7trfRvhHjqWjjCBLx0
sfXPbULNRAyEFFE=
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    friendlyName: caoxk1107
    localKeyID: 17 E6 1A 74 F3 38 00 05 46 B4 B1 42 18 1A FC 34 9B AB DB 08 
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDRaMHFhRycODXw
D7JBQ8N/JbN/PeXEqLuvXNa9MtCvAf2lhsm90dwyUyfiLcWVHO1Xz2SmySAC3Rpw
6h0XRpGSGCDl7jqx9yFkZwTw/cVco0K4iP473aa+3+x7CboTyrgKEKP+uwEVZINO
/zGIf9QAg2F9dV1A3jxzZYmWvAzmfWq62n76gqUN2Fs0TDFBV0bFUNuw0SUZQpXQ
Ex/j18kGCps+Y8ab0sVy9O+shKUYjdhURwniXJkHI2T0SYMHg844KshWh8FMit74
s7cUkgdPQd09Ubj7oBGN/XfcysMx5tgevXXhw9yqZLv+2dFEVzn6NKvxg7HNBY3u
r/a37fPTAgMBAAECggEAElQA4bDM2D9zORemml+79JzwIOrh+VxrUOXnRZf0+9xI
vvwVHDAJ/b2ZeApZiLuHanAUdySTUKzZa5iSAz+B7i9+caFwMbNXkNoTbKRJadpA
NLaIyeSUe5BNulcXmjPb98WNFPZ5Gc46T+e2BiRqAcF9/uUOzGanE9KHQFIlLucS
riBfYyvJw1S/AVoHvlBk6wldvnB5IRdcHHBdl+bLofBTxkDXcLDikhttxps9ix3P
YecuPEs5TkBiredYO9tJKCPYkcz2rdBioQHCRBsx3LInVzkVHEHrVLBbt9T3wgBA
IA+pliuUeVV/HeelqLGMwYQBlCmSxiZ5/gKF8zQ6wQKBgQDss5BaBg89sP68Rr6J
ba4j72pThoaeO+kYPGNeWKz9zhT3phf81NjxQ/THuJTPJ0bWhoKz58/HP1LTL9W1
lsihU7VNa7kVqOteWTDNkli087Kes5iqoWJVdLrJv2Tn+4EXltX0L5Musquord7v
3AE6dar9aleDzEp0wFr/x7wv5wKBgQDie4yqVLXzXOqnlPXdAsjEx7IC/ysgUsuD
HrvOBzjq9nGilk4IjGgCdzZujn3A80UcPN8boCcrVSDc0qTM8MCqD8t+8yEgRLD6
UA1MgUQfqZKictpsuwsNkQ/2OqUSPkCGUaSqfucCuYJtfxf/vbRfEYkvxShMuI1j
9bewWFqPNQKBgQCgeAOu5FjEzA+GeLeH19GtDwyYX6U39QnLonUDaz6sOmBAnFu6
zlndBuMV228XGVuO6FYHvWpBfA6cmdtaZkTSCjvpptQteP1IU1Mgqsx0sJoxuTQQ
yaQupxpS1+yC0SDtaxbVmsM/b2Wsz2NKXW5/wXIQp115PrBjglyu9yv/lQKBgAaD
oTcg+p7GVGV/jlbOBrJKQB9/8WCboQjjcGlrocJ4VipkAliSmUdA4IrrhEhxdtJq
Gcy0nYvMhgZz9JOEdTYvAB5lpdVExIZemRNTQH9cpEAR56Bq/NVmD7x4UVkl+zsh
zAevYLueVFcL6cfMUAzP908tb4xNXpu6bI8g63HlAoGAQNEzqSzVoLDpeeMUbo5y
OtCcT5p4Rin8VBG/izUFo6vXfeDcQU/VDaegDDokEvrPIGymxu1CHIfqF+E81KrK
cY/YmTkk9q6/jzFfJVQIZ29Y40kPBnEeWc1ij/H0ImwsUmKyvOh2Bq9wiFx4RHw+
LnXrKAC9CEnvZUmpam41UQ0=
-----END PRIVATE KEY-----

备注 从结果中可以清晰的看出,经由钥匙串中已经安装成功的证书(有何证书中配套的私钥才能安装成功),导出之后的 p12 文件中包含证书+私钥。而生成 CSR 文件时的私钥中导出的 p12 文件只包含私钥。

  • CA指令

CA指令相当于OpenSSL在内部实现了一个小型的CA系统,签发证书请求和生成CRL,维护一个已签发证书状态的文本数据库,因为实际使用中较少,本文不讨论该指令的使用。

下回分解

至此,OpenSSL 主要的功能介绍完毕,其中如有错误,强烈欢迎指正!另外,man comman到底怎么使用?No manual entry for rsa怎么解决?如果有高手知道,也请告知,万分感谢!

后文会对一些名词做出解释和总结,还会结合iOS中证书的申请、HTTPS的使用、iOS签名机制做出实践。

更多文章