Java——OpenSSL工具示例

目录

OpenSSL示例

1、Base64

echo "hello world" > a.txt

# 编码
openssl enc -none -in a.txt -out b.txt -a

# 解码
openssl enc -d -in b.txt -out c.txt -a

2、进制转换

echo "hello world" > a.txt

openssl未提供进制转换功能,此处使用xxd命令。

语法:

xxd [options] [infile [outfile]]

# or

xxd -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]

可用选项:

-a          切换自动跳过:单个“*”将替换零行。默认关闭。
-b          二进制数字转储(与-ps、-i、-r不兼容)。默认十六进制。
-C          C中的大写变量名包含文件样式(-i)。
-c cols     每行显示多少字节的十六进制数
-E          以EBCDIC显示字符。默认ASCII。
-e          little-endian转储(与-ps、-i、-r不兼容)。
-g          正常输出中每组八位字节的数量。默认值2,也就是每组16位(-e:4)
-h          打印此摘要。
-i          output in C include file style.
-l len      在len八位字节之后停止。
-o off      将off添加到显示的文件位置。
-ps         以纯十六进制输出,不分组
-r          反向操作:将hexdump转换(或修补)为二进制。
-r -s off   将off添加到在hexdump中找到的文件位置进行还原。
-s [+][-]seek  start at <seek> bytes abs. (or +: rel.) infile offset.
-u          使用大写十六进制字母。
-v          显示版本

2.1、二进制

xxd -b a.txt
00000000: 01101000 01100101 01101100 01101100 01101111 00100000  hello
00000006: 01110111 01101111 01110010 01101100 01100100 00001010  world.

每组16位:

xxd -b -g 2 a.txt
00000000: 0110100001100101 0110110001101100 0110111100100000  hello
00000006: 0111011101101111 0111001001101100 0110010000001010  world.

每行24位,每8位一组

xxd -b -c 3 -g 1 a.txt
00000000: 01101000 01100101 01101100  hel
00000003: 01101100 01101111 00100000  lo
00000006: 01110111 01101111 01110010  wor
00000009: 01101100 01100100 00001010  ld.

2.2、十六进制

xxd a.txt
00000000: 6865 6c6c 6f20 776f 726c 640a            hello world.

纯输出十六进制:

xxd -ps a.txt
68656c6c6f20776f726c640a

十六进制还原为ASCII:

xxd -ps a.txt b.txt

xxd -r b.txt c.txt

3、摘要

echo "hello world" > a.txt

3.1、MD5

openssl dgst -md5 a.txt

3.2、SHA

openssl dgst -sha1 a.txt

openssl dgst -sha224 a.txt

openssl dgst -sha256 a.txt

openssl dgst -sha384 a.txt

openssl dgst -sha512 a.txt

3.3、Hmac

# hmac md5 密钥为文本格式:123456
openssl dgst -md5 -hmac 123456 a.txt

# hmac sha
openssl dgst -sha1 -hmac 123456 a.txt

openssl dgst -sha224 -hmac 123456 a.txt

openssl dgst -sha256 -hmac 123456 a.txt

openssl dgst -sha384 -hmac 123456 a.txt

openssl dgst -sha512 -hmac 123456 a.txt

4、数字签名

echo "hello world" > a.txt

4.1、RSA

# 生成RSA私钥
openssl genrsa -out rsa_pri.key 1024

#获取公钥
openssl rsa -in rsa_pri.key -out rsa_pub.key -pubout

#私钥对a.txt文件的md5摘要签名
openssl dgst -md5 -sign rsa_pri.key -out a.txt.sign a.txt

#公钥验证
openssl dgst -md5 -verify rsa_pub.key -signature a.txt.sign a.txt

4.2、DSA

# 生成DSA参数
openssl dsaparam -genkey 512 -out dsa_param.pem

# 生成DSA私钥(未加密)
openssl gendsa -out dsa_pri.pem dsa_param.pem

# 生成DSA私钥(DES加密)
# openssl gendsa -des -out dsa_pri.pem dsa_param.pem

# 从DSA私钥中获取公钥
openssl dsa -in dsa_pri.pem -out dsa_pub.pem -pubout

# DSA私钥对a.txt文件的sha1摘要签名
openssl dgst -sha1 -sign dsa_pri.pem -out a.txt.sign a.txt

# 公钥验证
openssl dgst -sha1 -verify dsa_pub.pem -signature a.txt.sign a.txt

5、对称加密

echo "hello world" > a.txt

openssl enc命令的加密/解密实际需要3个参数:

  • salt:盐
  • key:密钥
  • iv:偏移量

指定参数的方式有两种:

  • 使用-k参数指定口令,salt和iv参数会通过口令值自动生成,而-salt是默认选项,自动生成随机盐。可以使用-p参数打印出生成3个参数。
  • 使用-S-K-iv分别指定,参数值为十六进制格式。

第一种方式:指定口令,随机参数

openssl enc -aes-128-cbc -in a.txt -out b.txt -k 123456 -p -a

生成的参数:

salt=B635730477446B43
key=221B15748FC08B4B02195C43200A1776
iv =3BCA529430619DC9A80FB82C4994414C

加密的结果:b.txt

U2FsdGVkX1+2NXMEd0RrQwc6aDuLKxNPOYKzmzT/HBk=

注意:OpenSSL 通过用户输入的密码及一个随机的 salt 来生成 key 和 iv,命令执行的生成的结果会包含 salt 值,所以会跟其他加密工具得到的结果不一致;

//结果
U2FsdGVkX1+2NXMEd0RrQwc6aDuLKxNPOYKzmzT/HBk=
//转换为16进制字符串
53616c7465645f5fb635730477446b43073a683b8b2b134f3982b39b34ff1c19
//可以拆解为三部分
53616C7465645F5F //第一部分:固定字符串 Salted__
B635730477446B43 //第二部分:Salt值
073A683B8B2B134F3982B39B34FF1C19 //第三部分:实际的加密结果

在这里插入图片描述

第二种方式:指定参数

openssl enc -aes-128-cbc -in a.txt -K 221B15748FC08B4B02195C43200A1776 -S B635730477446B43 -iv 3BCA529430619DC9A80FB82C4994414C -out b.txt -a

加密的结果:

BzpoO4srE085grObNP8cGQ==

注意:指定参数的情况,生成的加密结果,不再拼接 固定字符串 Salted__ 和 盐值 ,只生成实际的加密结果

BzpoO4srE085grObNP8cGQ==
# 转换为16进制,和第一种情况一致
073a683b8b2b134f3982b39b34ff1c19

5.1、DES/3DES

默认使用 PKCS7Padding 的填充方式。

示例:加密,使用-k指定口令,自动生成salt、key和iv

# des cbc模式,
openssl enc -des-cbc -in a.txt -out b.txt -k 123456 -p -a

# 生成的参数
salt=7AA4F9F3C097E845
key=A25521A566EB541E
iv =5A80160C11E6B19F

解密:

openssl enc -des-cbc -d -in b.txt -out c.txt -k 123456 -p -a

支持的des算法:

-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

5.2、AES

默认使用 PKCS7Padding 的填充方式。

示例:加密,使用-k指定口令,自动生成salt、key和iv

# des cbc模式,
openssl enc -aes-256-cbc -in a.txt -out b.txt -k 123456 -p -a

# 生成的参数
salt=B45AD1464DF9560F
key=C07B374310A10D25B5232DD91DC191F7368C20068DFA1715959267F858E74458
iv =8D5D232281BD9780158761FE7367F0CF

解密:

openssl enc -aes-256-cbc -d -in b.txt -out c.txt -k 123456 -p -a

支持的AES算法:

 -aes-128-cbc              -aes-128-cbc-hmac-sha1    -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-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-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 

5.3、RC

RC算法不支持IV偏移量和填充模式,是流密码。

示例:加密,使用-k指定口令,随机生成的salt

openssl enc -rc4 -in a.txt -out b.txt -k 123456 -p -a

#生成的参数
salt=980E135E48CCF840
key=1A52689CE1ED303E3FDDFA6CC3E3D8F9

生成的文件:b.txt

U2FsdGVkX1+YDhNeSMz4QN77pe7PI6zZwMdNYw==

# 转换为16进制
53616c7465645f5f980e135e48ccf840defba5eecf23acd9c0c74d63

53616C7465645F5F //第一部分:固定字符串 Salted__
980e135e48ccf840	//第二部分:salt值
defba5eecf23acd9c0c74d63 //第二部分,加密结果

在这里插入图片描述

解密:

openssl enc -rc4 -d -in b.txt -out c.txt -k 123456 -p -a

支持的RC算法:

-rc2                      -rc2-40-cbc
 -rc2-64-cbc               -rc2-cbc                  -rc2-cfb
 -rc2-ecb                  -rc2-ofb                  -rc4
 -rc4-40                   -rc4-hmac-md5

5.4、Camellia

示例:加密,使用-k指定口令,自动生成salt、key和iv

# des cbc模式,
openssl enc -camellia-128-cbc -in a.txt -out b.txt -k 123456 -p -a

# 生成的参数
salt=B22FA946BD7466B2
key=265CFFF1126D61AD671A990EEAE6A95E
iv =45586672E74318603A28593F4371241E

解密:

openssl enc -camellia-128-cbc -d -in b.txt -out c.txt -k 123456 -p -a

支持的camellia算法:

-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 

6、非对称加密

6.1、RSA

生成rsa密钥对:

# 生成私钥
openssl genrsa -out rsa_pri.key 2048

#获取公钥
openssl rsa -in rsa_pri.key -out rsa_pub.key -pubout

方式一:使用rsautl命令

#公钥加密
openssl rsautl -encrypt -inkey rsa_pub.key  -pubin  -in a.txt -out b.txt

#私钥解密
openssl rsautl -decrypt -inkey rsa_pri.key  -in b.txt -out c.txt

方式二:使用pkeyutl命令

# 公钥加密
openssl pkeyutl -encrypt -pubin -in a.txt -inkey rsa_pub.key -out b.txt

# 私钥解密
openssl pkeyutl -decrypt -in b.txt -inkey rsa_pri.key -out c.txt

6.2、DH

# 创建dh参数文件dhp.pem 
openssl genpkey -genparam -algorithm DH -out dhp.pem 

# 用dh 参数文件创建私钥dhkey1.pem
openssl genpkey -paramfile dhp.pem -out dhkey1.pem
openssl pkey -in dhkey1.pem -text -noout

# 用dh 参数文件创建私钥dhkey2.pem
openssl genpkey -paramfile dhp.pem -out dhkey2.pem
openssl pkey -in dhkey2.pem -text -noout

# 创建私钥dhkey1.pem对应的公钥dhpub1.pem
openssl pkey -in dhkey1.pem -pubout -out dhpub1.pem
openssl pkey -pubin -in dhpub1.pem -text 

# 创建私钥dhkey2.pem对应的公钥dhpub2.pem
openssl pkey -in dhkey2.pem -pubout -out dhpub2.pem
openssl pkey -pubin -in dhpub2.pem -text 

# 用自己的私钥和对方的公钥获取共享密钥
openssl pkeyutl -derive -inkey dhkey1.pem -peerkey dhpub2.pem -out secret1.bin

# 用对方的私钥和自己的公钥获取共享密钥
openssl pkeyutl -derive -inkey dhkey2.pem -peerkey dhpub1.pem -out secret2.bin

# 甲方共享密钥十六进制编码
xxd -ps secret1.bin

#输出
58d630691f74a0035b77f0689d79ac3e5fe65273ef20c27327d3de04e305
74010fc1e7c4a9ada8f9ac2a09a9fddfdb5b49d4d5c35e77ad5b73a4bc9b
14eb6d7f87b06144f700aac52a97a23ca6bfb818355eae5abb8f5460e591
1ba6f1b56a5af8deb125b18ee93c4712b5b0fe24bead6e35d1c87bb42674
3164cc1adffa2afa

# 乙方共享密钥十六进制编码
xxd -ps secret2.bin

#输出
58d630691f74a0035b77f0689d79ac3e5fe65273ef20c27327d3de04e305
74010fc1e7c4a9ada8f9ac2a09a9fddfdb5b49d4d5c35e77ad5b73a4bc9b
14eb6d7f87b06144f700aac52a97a23ca6bfb818355eae5abb8f5460e591
1ba6f1b56a5af8deb125b18ee93c4712b5b0fe24bead6e35d1c87bb42674
3164cc1adffa2afa

# 两者一致,后续就可以使用对称加密算法,该值作为口令加密/解密。需要注意的是,DH密钥长度为512~1024,默认1024,必须为64的倍数,所以使用的对称加密算法密钥长度要支持该长度。

7、证书

7.1、证书请求

1)、根据已有私钥生成新的证书请求(默认sha256算法签名)

如果你已经有了一个私钥,那么可以直接用它来向CA申请证书。

# 生成rsa密钥
openssl genrsa -out pri_key.pem

# 根据密钥生成证书请求
openssl req -new -key pri_key.pem -out req.csr -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton"
2)、密钥和证书请求一起生成

下面的命令创建一个2048位的私钥(pri_key.pem)以及一个CSR(req.csr):

# 生成rsa密钥pri_key.pem,长度为2048,同时生成证书req.csr
openssl req -newkey rsa:2048 -nodes -keyout pri_key.pem -out req.csr -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton"
3)、使用已有的证书和私钥生成证书请求

如果你需要续订已有的证书,但你和CA都没有原始的CSR,那可以再次生成CSR。

例如,下面的命令使用已有的证书(domain.crt)和私钥(domain.key)创建一个新的CSR:

openssl x509 -in domain.crt -signkey pri_key.pem  -x509toreq -out req.csr
4)、生成证书请求时指定签名算法
# 指定md5签名
openssl req -new -key pri_key.pem -out req.csr -md5 -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton"
5)、验证请求文件的数字签名
openssl req -verify -in req.csr
6)、查看证书请求文件内容
openssl req -in req.csr
#或
cat req.csr
#或 详细信息
openssl req -in req.csr -text
7)、提取证书请求的公钥
openssl req -in req.csr -pubkey -noout -out rsa_pub.pem

7.2、自签名证书

1)、生成自签名证书

如果你需要使用HTTPS加固服务器,但不需要CA签发的证书,就可以使用自签名证书。

下面的命令创建一个2048位的私钥(pri_key.pem,未加密)以及一个自签名证书(domain.crt)

openssl req -newkey rsa:2048 -nodes -keyout pri_key.pem -x509 -days 365 -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton" -out ca.crt

-x509选项指出我们要创建自签名证书,-days 365选项声明该证书的有效期为365天。在上面的命令执行过程中将创建一个临时CSR来收集与证书相关的CSR信息。

2)、使用已有私钥生成自签名证书

也可以使用已有私钥来生成自签名证书。例如,下面的命令使用已有的私钥(pri_key.pem)生成一个自签名证书(ca.crt):

openssl req -key pri_key.pem -new -x509 -days 365 -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton" -out ca.crt
3)、使用私钥和证书请求构建自签名证书

下面的命令使用私(pri_key.pem)和CSR(req.csr)创建一个自签名证书(ca.crt):

openssl req -x509 -key pri_key.pem -in req.csr -out ca.crt -days 365

7.3、查看证书

1)、查看证书文件信息
openssl x509 -in ca.crt -text
2)、查看证书条目
openssl x509 -text -noout -in ca.crt
3)、验证证书是否由CA签发

下面的命令用来验证证书doman.crt是否由证书颁发机构(ca.crt)签发:

openssl verify -verbose -CAFile ca.crt domain.crt
4)、查看证书中的公钥
openssl x509 -in ca.crt -inform PEM -pubkey -noout

7.4、证书格式转换

1)、PEM转DER

可以将PEM编码的证书ca.crt转换为二进制DER编码的证书ca.crt:

openssl x509 -in ca.crt -outform der -out ca.der

DER格式通常用于Java。

2)、DER转PEM

可以将DER编码的证书(ca.der)转换为PEM编码(ca.crt):

openssl x509 -inform der -in ca.der -out ca.crt
3)、PEM转PKCS7

可以将PEM证书(ca.crt和ca-chain.crt)添加到一个PKCS7(domain.p7b)文件中:

openssl crl2pkcs7 -nocrl -certfile ca.crt -certfile ca-chain.crt -out ca.p7b

使用-certfile选项指定要添加到PKCS7中的证书。

PKCS7文件也被称为P7B,通常用于Java的Keystore和微软的IIS中保存证书的ASCII文件。

4)、PKCS7转换为PEM

使用下面的命令将PKCS7文件(domain.p7b)转换为PEM文件:

openssl pkcs7 -in domain.p7b -print_certs -out domain.crt

如果PKCS7文件中包含多个证书,例如一个普通证书和一个中间CA证书,那么输出的PEM文件中将包含所有的证书。

5)、PEM转换为PKCS12

可以将私钥文件(pri_key.pem)和证书文件(ca.crt)组合起来生成PKCS12 文件(domain.pfx):

openssl pkcs12 -export -inkey pri_key.pem -in ca.crt -out domain.pfx -password pass:123456

如果不指定-password pass:123456,将提示你输入导出密码,可以留空不填。PKCS12文件也被称为PFX文件,通常用于导入/导出微软IIS中的证书链。

6)、PKCS12转换为PEM
openssl pkcs12 -in domain.pfx -passin pass:123456 -nodes -out domain.combined.crt

注意如果PKCS12文件中包含多个条目,例如证书及其私钥,那么生成的PEM文件中将包含所有条目。

7.5、私钥生成与验证

1)、创建私钥

下面的命令创建一个密码保护的2048位私钥domain.key:

openssl genrsa -des3 -out domain.key 2048

上面命令会提示输入密码。

2)、验证私钥

下面的命令可以验证私钥domain.key是否有效:

openssl rsa -check -in domain.key

如果私钥是加密的,命令会提示输入密码,验证密码成功则会显示不加密的私钥。

3)、验证私钥与证书和CSR匹配

使用下面的命令验证私钥domain.key是否与证书domain.crt以及CSR匹配:

# 生成证书请求
openssl req -new -key domain.key -passin pass:123456 -out domain.csr -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton"

# 生成自签名证书
openssl req -x509 -key domain.key -passin pass:123456 -in domain.csr -out domain.crt -days 365
openssl rsa -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
openssl req -noout -modulus -in domain.csr | openssl md5

如果上面三个命令的输出一致,那么有极高的概率可以认为私钥、证书和CSR是相关的。

4)、加密私钥

下面的命令将私钥unencrypted.key加密,输出加密后的私钥encrypted.key:

openssl rsa -des3 -in unencrypted.key -out encrypted.key

上面命令执行时会提示设置密码。

5)、解密私钥

下面的命令将加密私钥encrypted.key解密,并输出明文结果:

openssl rsa -in encrypted.key -out decrypted.key

上面命令执行时会提示输入解密密码。

7.6、根证书

1)、生成本地CA根证书
# 生成2048位的RSA私钥,用于根证书的签名和加密。
openssl genrsa -out root.key 2048

# 创建根证书,使用根证书私钥生成自签名的根证书
openssl req -x509 -new -key root.key -out root.crt -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton"
2)、根证书签署证书请求

对于每个需要颁发证书的实体(例如服务器或客户端),你需要创建一个证书请求文件(CSR 文件)。

# 生成密码保护的私钥,口令为123456
openssl genpkey -algorithm RSA -out private.pem -pass pass:123456 -aes256
# 或者无密码的私钥
penssl genpkey -algorithm RSA -out private.pem
# 创建证书请求
openssl req -new -key private.pem -passin pass:123456 -out certificate.csr -subj "/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton"

签署证书:使用根证书的私钥签署证书请求,生成证书文件(certificate.crt)。运行以下命令生成签署的证书文件:(下级证书)

openssl x509 -req -in certificate.csr -CA root.crt -CAkey root.key -CAcreateserial -out certificate.crt

生成一个PKCS12并设置密码:

openssl pkcs12 -export -in certificate.crt -inkey private.pem -passin pass:123456 -out certificate.p12 -password pass:123456
3)、查看PKCS12信息
openssl pkcs12 -in certificate.p12 -info -password pass:123456 -passout pass:123456
MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: 82 EE B0 B5 2B 10 4D 87 D1 63 82 78 92 E7 20 0F E7 02 BE F4
subject=/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton
issuer=/C=CN/ST=BJ/L=BJ/O=acton/OU=acton/CN=acton
-----BEGIN CERTIFICATE-----
MIIDKjCCAhICCQDi/Gw0oalrxDANBgkqhkiG9w0BAQUFADBXMQswCQYDVQQGEwJD
TjELMAkGA1UECAwCQkoxCzAJBgNVBAcMAkJKMQ4wDAYDVQQKDAVhY3RvbjEOMAwG
A1UECwwFYWN0b24xDjAMBgNVBAMMBWFjdG9uMB4XDTIzMTIwMzE2Mjk0MVoXDTI0
MDEwMjE2Mjk0MVowVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkJKMQswCQYDVQQH
DAJCSjEOMAwGA1UECgwFYWN0b24xDjAMBgNVBAsMBWFjdG9uMQ4wDAYDVQQDDAVh
Y3RvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKvYzXwTCZ5+Mlkx
zhMvzMOiyfSSlKwXOrigDeEONUj2ZAR3rtaMqRCVRfxXxBthY2nwDzMBtz+CjfGG
gGJU6GjmZlTxg0at76oLE9IJNX2eVfzOIXNutuftrLLInMX5Cg4JxzVtqFTEc2aA
bM/G2ZlCvpRZPGusa+YP99jjSPwqU3U9DMzHDJUmMo+gEw4HNC4UeoTpX6qfa42Q
yZvBrVeUnuj43qW/Jn4SDAEiLZYjk4Qq5j6eAdj4c1z7gwhvyppvyhZf0sNJrzsd
GcUcwXvwDGWr0h2GOcPC+eaoe55rPHvWJnLeDU6a0+IjQ0BQTnqR+dcSyYyvvdF8
M23CYGUCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAccVqnC9hoj6ERR1Cx//DnB6P
177rNEo8nxgpsiVZmimlrWofhiJLqwSSuVURlZWR87MptrAMbBip2p32rQRwcLvd
7c2a4WbXx72zBNbLcxDYgUzm7q5whUA6fdnvrNR21e0mTYsDEg2uCaqAFnXlM5NC
SA/KKck7gUC4eeFCP51ie5h3DxIZDsQfsNg/C4tIYwDpR4e7WaWFNZIG+oiTAaij
/5BoeyZ4F5Akv3v/5And2+ny/Kw0SCgY8+oSjorq6uuhIJrFVtwxxoTA9kIZevQQ
vp0StKIrqhNVDj0Wn588J/63Yjx6sN1KWfQEHp1zKGTZc0x7YQCdKOa8fb0pBg==
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    localKeyID: 82 EE B0 B5 2B 10 4D 87 D1 63 82 78 92 E7 20 0F E7 02 BE F4
Key Attributes: <No Attributes>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIPWFtXwjftsgCAggA
MBQGCCqGSIb3DQMHBAgFo/Wri9o5XgSCBMh9ADLM6aU3SQ/dRiOHE4xMiH3nHQRf
hKAQECb027w8CCV2YqGeB2O21jz4VV1e65zPWmhsL+b4yV4MuQcSaCPwVlQdnRp4
9K/I6NlhNdeKdhu2+ozS8cKJ7hDBtXIkUs54eQUaJb2bU6CKS+7fNpSK4uRa7I6T
/RcFatxBoZs3Wi4S7IN+jhx7BjvHawZh9LmUGeDNSsRlr++o1awS2MfPJCo2a4C4
6bmVcDlCkF7SBWBkdC82szvrA7HobKRf9bqOhkYmhT405XczRDv/E6BAkx2Wbj6p
r8zrkQh43pdeBzOaNlnZ2UoMeipS2emmA3hRN5HjPeMvOIhv3CYTS3UPTaZjgnOu
aV1ggQMDEmDONeJCn8WfM3X0+TdJUyS+mxD7LWk/7QL2JnpApoyvNNKWCuQ0QeQt
cP0U+tngs6rFh7cr2Ahugt/aW6fwydwvNrPL33mIyRFARSZ0VCjHF++gCmEWV05K
kt5KqA3NZ/Z/hVlARFZlPONPuFZh8SMZnxZcNMQFZ43/W10rHvaLj5zg8wx/G8MT
aYEIAUEdhhKILKdOClrOKdElPv62hNWEUmaI/7aLloIbzHNp8ItX4+2gsEJINhbq
NTcEydVXy7HQHF+4Lhix51IrEcfUXfn8LfzxJtm3xO9v+6kQsz+J9gbbyuJeMnSp
Ig44XIIXTcBCU1sCT9Yc1zkUJiihrc239pBMmGbyuYlyvu3jZssJmWPXS9FgbMyn
15jtvqB56++p9zJe6MDZnYGDZS9y7D5ZqR0tmunWCEd2toqU1ZEmNx0jQlCLJ8Ch
bQ4fNOLeS3OiMHDtHTKef8tesk6k6fTXQULcYpS3KCm0TpVKOTeAEghfKaMaWOw2
qwrAhDNpogspXPY1IDhUTT1QJ0cMoSCMFk+Bxj7KFUnTGTc2/oPHCII+lbVSpbjV
/RY04E6PeaAQwNis9ojyDMetD/8EWbFlLNvj3ibVnANpDjkW5NljUhDb8+wogNxF
0EipB9cEIADkHM9euVx3S0iHFML2n1aBkYZf2OVUZZ/94fSg+OkPF88sMJO7U7xo
zpuX3CAgqjawx62LTs82xE9SGd0g2Wni7wtWhex4iHh6NfxfkElMvUxqt4Wy3PzD
wFH19EpFSnKcp8srcc0iueeBAaEbQ1ySkH1Yx1sws1PXMYywUMFtZleg+V24YTKc
KpiJKZ1r3p6BdE9k9ntM4qLP9XLa9VqibYSDLCSjpe47yRsCF6JJmxaujYk2CnjI
/HZdKXeOyBWUMWUX58jAsu+OVeLn+Vlh/Hxtl5ObcS14uJ9BSl44EN4s+EsNSPyA
+OmsHAdiUQxmHBNTKfSj8Erq0A5Di4wAca+HFflZc70pGAwpSuh7f6FZFo9JDikw
GN2eiq/t/wrBZLlVzKGRq8K/tjtKRBGBUen/nWeTUtGAXgtp6bWc/9uEvULnJqq4
DfrWDKihYTUfxCT2sduIoKhaSRbts6oCTaP/w8DIIebsZuUYCE7mex6zTXDh8PLa
/5vk/J8Jhd32yAfQ4O7EA9X9ReXZ25fgEtBYVhkF/bs3avkNO4oK6TuAltqMantM
m9N0c3gWG8pznIHxJsqMSKX55Yo5NrXaA87E3JR05isBJHuuQ2JGAoYPc6iTHxj9
l30=
-----END ENCRYPTED PRIVATE KEY-----
4)、从PKCS12中提取私钥

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

openssl pkcs12 -in certificate.p12 -out private.pem -nodes -password pass:123456

不输入-nodes:

openssl pkcs12 -in certificate.p12 -out private.pem -password pass:123456

// 要求输入加密导出的PEM文件的密码
MAC verified OK
Enter PEM pass phrase: 123456
Verifying - Enter PEM pass phrase: 123456

7.7、多级CA证书链签发证书

操作步骤:

  1. 生成根CA证书并自签
  2. 生成二级CA证书并使用CA证书签发
  3. 生成服务器证书并使用二级CA证书签发
  4. 制作CA证书链
  5. 打包为p12文件
  6. 转化为keystore文件
1)、生成根CA证书并自签
# 创建root-ca并自签名
openssl req -x509 -newkey rsa:2048 -nodes -keyout root-ca.key -out root-ca.crt -days 3650  -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=root-ca"

# 查看创建的证书
openssl x509 -in root-ca.crt -text -noout
2)、生成二级CA证书并使用CA根证书签发
# 创建secondary-ca的证书签名请求
openssl req -new -newkey rsa:2048 -nodes -keyout secondary-ca.key -out secondary-ca.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=secondary-ca"

# 使用root-ca签发secondary-ca的证书签名请求
openssl x509 -req -in secondary-ca.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out secondary-ca.crt -days 3650

# 查看创建的证书
openssl x509 -in secondary-ca.crt -text -noout
3)、生成服务器证书并使用二级CA证书签发
# 创建server的证书签名请求
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=server"

# 用secondary-ca签发server的证书签名请求
openssl x509 -req -in server.csr -CA secondary-ca.crt -CAkey secondary-ca.key -CAcreateserial -out server.crt -days 3650

# 查看创建的证书
openssl x509 -in server.crt -text -noout
4)、制作CA证书链
# server.crt的签发是secondary-ca,而secondary-ca的签发是root-ca
# 对server.crt的验证必须使用到这两个证书,需要制作为证书链。
# 制作证书链的方法直白而简单:将证书拼接在一个文件中即可
cat root-ca.crt secondary-ca.crt > chain-ca.crt
5)、打包为pkcs12格式

注意:如果给-CAfile传入的不是root-ca.crt和secondary-ca.crt拼接后chain-ca.crt文件,而是给server.crt直接授权的secondary-ca.crt文件,命令行将会报错:

Error unable to get issuer certificate getting chain.
# 打包为p12文件
openssl pkcs12 -export -in server.crt -inkey server.key -chain -CAfile chain-ca.crt -name server -out server.p12 -password pass:123456

# 查看生成p12文件
openssl pkcs12 -in server.p12 -password pass:123456

# 只查看私钥
openssl pkcs12 -in server.p12 -nocerts -nodes -password pass:123456

# 只查看客户端证书(非CA证书)
openssl pkcs12 -in server.p12 -clcerts -nokeys -password pass:123456

# 只查看CA证书
openssl pkcs12 -in server.p12 -cacerts -nokeys -chain -password pass:123456
6)、转换JKS密钥库
# 将server.p12转化为server.jks
keytool -importkeystore -deststorepass 123456 -destkeystore server.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass 123456 -noprompt

#查看keystore文件
keytool -list -v -keystore server.jks -v -storepass 123456

#查看keystore文件 (rfc 格式)
keytool -list -rfc -keystore server.jks -storepass 123456

Java中的KeyStore内部包含如下几种条目:

  • PrivateKeyEntry:它包含了一个私钥,这个私钥是加密的,查看时也不会显示,也不能导出,但要清楚的是,这个私钥是实实在在存在。同时,它还会包含这个私钥对应的证书链。
  • SecretKeyEntry:它包含了一个密钥,SecretKey。
  • TrustedCertificateEntry:包含一个受信任的证书。

所以,转成server.jks的文件是包含了server.p12中的全部信息:一个私钥+3个证书组成的证书链。既然keystore文件无法导出密钥,一般的处理方法是先将其转为p12文件,然后就可以导出密钥了。

7)、使用openssl x509和openssl ca签发CA证书的差别

使用openssl x509和使用openssl ca没有本质差别,openssl ca使用的配置文件,文件中配置固定的index.txt和serial文件,来记录签发过的证书,确保不会重复签发。如果把当前服务器作为专门的CA签发机构,使用openssl ca及其关联的配置文件会更好一些。如果只是命令行临时生成一下,用openssl x509完全可以满足需求。

此外,从测试来看,openssl x509签发的只能是v1版本的,即使加了-extensions v3_ca也无效,但是openssl ca -extensions v3_ca签发出来的就是v3版本的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值