公私钥和证书的生成与管理

百科:

公开密钥加密 - 维基百科

RSA加密算法 - 维基百科

公开密钥指纹 - 维基百科

RSA 非对称加密算法,公钥加密->私钥解密、私钥加密(签名)->公钥解密(验签)。

RSA 非对称加密算法,被加密的数据长度,需要短于密钥长度,否则会加密失败。RSA 分段加密

推荐链接:

密钥、证书生成和管理总结

DER、CRT、CER、PEM格式的证书及转换

OpenSSL与KeyStore指令小集

JAVA解析各种编码密钥对(DER、PEM、openssh公钥)

使用openssl命令剖析RSA私钥文件格式

在线工具:

https://www.ssleye.com/

https://www.getssl.cn/ssltools

https://csr.chinassl.net/

https://www.chinassl.net/ssltools/

OpenSSH (ssh-keygen组件)

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。不过,SSH也被指出有被嗅探甚至解密的漏洞 (详见百科),RSA多重攻击工具:从弱公钥中解密数据并尝试恢复私钥SSH的安全验证

OpenSSHOpenBSD Secure Shell)是使用SSH透过计算机网络加密通信的实现,带有多个命令行工具 (详见百科)。其中的 ssh-keygenUnix和类Unix计算机系统上的安全外壳(SSH)协议套件的标准组件,用于通过使用各种 加密技术 在不安全的网络上建立远程计算机之间的安全shell会话。ssh-keygen 实用程序用于生成、管理和转换身份验证密钥。这些密钥与相关工具GnuPG使用的密钥不同。ssh-keygen 支持的算法 RSADSAECDSA 等。

如何使用ssh-keygen生成新的SSH密钥 :

ssh-keygen 随 SSH 软件包提供。

命令语法如下:

1
ssh-keygen [选项]

重要选项如下:

选项 描述
-b <bits> 指定要密钥中的位数。 可能要求使用特定(最少)的密钥长度。
-B 对于ssh-keygen2,以Bubble Babble格式显示公钥指纹
-C <comment> 提供新注释。
-f <file> 指定用于存储密钥的文件名(全路径名)。
-l 显示公钥指纹
-e <export> 导出为其它格式的密钥文件,可以转换密钥类型
-i <input> 从其他格式的密钥文件导入,可以转换密钥类型
-m <PEM|PKCS8|RFC4716|SSH2> 可与-e,-i配合使用,指明导出或导入的密钥文件格式
-N <password> 新密码。
-o 使用新的OpenSSH格式。
-p 更改私钥文件的密码。允许使用[-P old_passphrase][-N new_passphrase],保存新私钥[-f keyfile]
-P <password> 旧密码。
-q 静默ssh-keygen。 在创建新密钥时,/etc/rc文件会使用它。
-t <type> 指定要创建的密钥类型。
SSH1:RSA
SSH2:RSADSAECDSA
-y 读取专用的OpenSSH格式文件,并将OpenSSH公用密钥打印到stdout。

密钥对生成

若不指定 -f 参数,默认情况下,用户的 SSH 密钥存储在 ~/.ssh 目录下。

1
2
3
4
5
6
7
8
# BEGIN RSA PRIVATE KEY
$ ssh-keygen -C "hello@zhaolq.com" -f /home/id_rsa1 -b 4096
# BEGIN RSA PRIVATE KEY
$ ssh-keygen -t rsa -f /home/id_rsa2 -b 1024
# BEGIN OPENSSH PRIVATE KEY
$ ssh-keygen -o -t rsa -f /home/id_rsa3 -b 1024
# BEGIN DSA PRIVATE KEY
$ ssh-keygen -t dsa -f /home/id_rsa4 -b 1024

RSA PRIVATE KEY-----BEGIN RSA PRIVATE KEY----- 开头;

OPENSSH PRIVATE KEY-----BEGIN OPENSSH PRIVATE KEY----- 开头;

二者可以通过 PuTTY工具 进行转换,后文有介绍该工具。

公钥提取

1
2
# 从私钥提取OpenSSH格式公钥
ssh-keygen -y -f priKey.pem > sshPubkey.pub

公钥转换

1
2
3
4
5
6
7
8
9
10
11
12
13
# 将SSH2公钥转换成OpenSSH公钥
$ ssh-keygen -i -m ssh2 -f ssh2.pub > openssh.pub # -i:默认导入的文件格式为SSH2
# 将PEM格式PKCS#8标准公钥转换成OpenSSH公钥
$ ssh-keygen -i -m PKCS8 -f PKCS8Pubkey.pem > openssh.pub
# 将PEM格式PKCS#1标准公钥转换成OpenSSH公钥
$ ssh-keygen -i -m PEM -f PKCS1Pubkey.pem > openssh.pub

# 将OpenSSH公钥转换成SSH2公钥
$ ssh-keygen -e -m ssh2 -f openssh.pub > ssh2.pub # -e:默认导出的文件格式为SSH2
# 将OpenSSH公钥转换成PEM格式PKCS#1标准公钥
$ ssh-keygen -e -m PEM -f openssh.pub > PKCS1Pubkey.pem
# 将OpenSSH公钥转换成PEM格式PKCS#8标准公钥
$ ssh-keygen -e -m PKCS8 -f openssh.pub > PKCS8Pubkey.pem

windows下的OpenSSH

image-20210203100529136

使用 SSH 远程 Linux:

1
ssh -i G:\pvt_pkcs1.pem root@8.129.8.11 -p 22

修改文件权限:

image-20210203103207726

image-20210203103214898

总结

OpenSSH 公钥可用于 OpenSSH 授权,以 ssh-rsa + 空格 开头,后跟一串字符,以 空格 + 注释 结尾。注释部分可以随意修改,也可删除。

使用 SSH 基于 密钥 的安全验证来远程登录系统,只需要将 id_rsa.pub 文件中的内容粘贴到远程系统的 /root/.ssh/authorized_keys 文件中,然后配置远程工具私钥认证即可。

Putty 基于密钥登录只能使用 ppk 文件格式;而其他ssh客户端,大多都只能使用 PEM格式 (PKCS#1标准)。

OpenSSL

genrsa,genpkey,req在证书请求时同时生成密钥, gendh, gendsa

OpenSSL -维基百科

https://www.openssl.org/docs/

https://www.openssl.org/docs/apps/openssl.html

https://www.openssl.org/docs/manmaster/ :大师手册

https://www.openssl.org/docs/manmaster/man1/ :OpenSSL commands

https://www.openssl.org/docs/manmaster/man1/openssl.html :openssl

OpenSSL是一种加密工具套件。

为了减少全局手册页名称空间的混乱,在OpenSSL 3.0中不推荐使用不带 openssl- 前缀的手册页条目,并将在OpenSSL 4.0中将其删除。

–help

1
2
3
openssl --help
# 每个openssl子命令同样可以使用 --help
openssl genrsa --help

查看openSSL版本

1
2
openssl version
openssl version -a

openssl-genpkey 生成私钥

弃用:

https://www.openssl.org/docs/manmaster/man1/genrsa.html

https://www.openssl.org/docs/manmaster/man1/openssl-genrsa.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-genpkey.html

https://www.openssl.org/docs/manmaster/man1/openssl-genpkey.html#EXAMPLES

1
2
3
4
5
6
7
8
openssl genpkey -help

# 生成RSA密钥,位长度为2048
openssl genpkey -algorithm RSA -out privatekey.pem -pkeyopt rsa_keygen_bits:2048
# 生成RSA密钥,位长度为2048,使用3DES加密
openssl genpkey -algorithm RSA -out privatekey.pem -pkeyopt rsa_keygen_bits:2048 -des3 -pass pass:123456
# 生成RSA密钥,位长度为2048,使用3DES加密,输出格式为DER
openssl genpkey -algorithm RSA -out privatekey.der -pkeyopt rsa_keygen_bits:2048 -des3 -pass pass:123456 -outform DER

密钥文件管理和转换

openssl-rsa RSA密钥处理命令

弃用:

https://www.openssl.org/docs/manmaster/man1/rsa.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-rsa.html

openssl rsa [options] outfile

  • -in <infile> 输入密钥文件
  • -inform <DER|NET|PEM> 输入密钥格式,默认为PEM
  • -passin pass:<password> 输入密钥保护密码
  • -out <outfile> 输出密钥文件
  • -outform <DER|NET|PEM> 输出密钥格式,默认为PEM
  • -passout pass:<password> 输出密钥保护密码
  • -pubin 指示输入的是公钥,默认输出的是密钥对或私钥
  • -pubout 输出公钥到文件(公钥一般无需加密)
  • -des, -des3, -aes128, -aes192, -aes256 指定密钥加密算法
  • -text 明文输出密钥参数
  • -noout 不输出密钥到文件,打印到标准输出
  • -check 验证一致性
  • -modulus 显示RSA密钥模值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 修改加密算法并设置密码,这里的des3作用在输出密钥。输入密钥信息中包含了对称加密算法,只需要给出密码
openssl rsa -in privatekey.pem -passin pass:123456 -des3 -out privatekey2.pem -passout pass:654321
# 删除RSA私钥的加密密码
openssl rsa -in privatekey2.pem -passin pass:654321 -out privatekeyout.pem
# 使用三重DES加密私钥
openssl rsa -in privatekeyout.pem -des3 -out 3desprivatekey.pem # 需要手动输入加密密码
openssl rsa -in privatekeyout.pem -des3 -out 3desprivatekey.pem -passout pass:123456

# 检查私钥是否为有效的RSA密钥:
openssl rsa -check -in privatekey.pem

# 从私钥中提取PEM格式公钥 (PKCS#8标准)
openssl rsa -in privatekey.pem -pubout -out publickey.pem
# 从私钥中提取PEM格式公钥 (PKCS#1标准)
openssl rsa -in privatekey.pem -RSAPublicKey_out -out publickey.pem

# 转换私钥格式(PEM->DER)
openssl rsa -in privatekey.pem -outform der -out privatekey.der
# 转换私钥格式(DER->PEM)
openssl rsa -in privatekey.der -inform der -out privatekey.pem

# 将私钥打印到标准输出
openssl rsa -in privatekey.pem -text -noout

openssl-pkey 公钥或私钥处理命令

该处理命令和 openssl-rsa 使用很相似,它可以处理更多的公开密钥加密算法 (RSA、DSA、ECDSA等)。

弃用:

https://www.openssl.org/docs/manmaster/man1/pkey.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-pkey.html

https://www.openssl.org/docs/manmaster/man1/openssl-pkey.html#EXAMPLES

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 删除私钥的加密密码
openssl pkey -in key.pem -out keyout.pem
# 使用三重DES加密私钥
openssl pkey -in key.pem -des3 -out keyout.pem

# 转换私钥格式(PEM->DER)
openssl pkey -in key.pem -outform DER -out keyout.der
# 转换私钥格式(DER->PEM)
openssl pkey -in key.der -inform der -out keyout.pem

# 将私钥打印到标准输出
openssl pkey -in key.pem -text -noout
# 将私钥的公共部分打印到标准输出
openssl pkey -in key.pem -text_pub -noout

# 仅输出私钥的公共部分
openssl pkey -in key.pem -pubout -out pubkey.pem

# PKCS1私钥转换为PKCS8
openssl pkey -in PKCS1.pem -out PKCS8.pem
openssl pkcs8 -in PKCS1.pem -topk8 -nocrypt -out PKCS8.pem
# PKCS8私钥转换为PKCS1
openssl rsa -in PKCS8.pem -out PKCS1.pem
openssl ec -in PKCS8.pem -out PKCS1.pem

openssl-req

该命令主要创建和处理 PKCS#10 格式的证书请求(CSR),它还可以创建自签名证书以用作根CA。

弃用:

https://www.openssl.org/docs/manmaster/man1/req.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-req.html

根证书

根证书 是认证中心机构(Certificate Authority)给自己签发的证书,签发者就是自身,是信任链的起点。里面包含了CA信息、CA公钥、用自身的私钥对这些信息的签名。下载并使用根证书就表示你信任它的来源机构,自然也信任证书以下签发的所有证书。某个证书可以用签发他的证书中的公钥验证,签发他的证书又需要上一层签发证书来验证,直到通过根证书中的公钥验证,那么这个证书就是可信任的。

证书标准

X.509 - 维基百科

证书文件扩展名

证书扩展名 - 维基百科

X.509有多种常用的扩展名。不过其中的一些还用于其它用途,就是说具有这个扩展名的文件可能并不是证书,比如说可能只是保存了私钥。

PKCS#7 是签名或加密数据的格式标准,官方称之为容器。由于证书是可验真的签名数据,所以可以用SignedData结构表述。 .P7C文件是退化的SignedData结构,没有包括签名的数据。

PKCS#12 由PFX进化而来的用于交换公共的和私有的对象的标准格式。

证书获取及相关工具

https://www.getssl.cn/

向权威机构要证书通常是要钱的,但也有免费的。

image-20210119113131137

向权威证书颁发机构申请证书

关于证书签署请求(CSR)

如果你想从证书颁发机构 (certificate authority 简称 CA) 那里获得 SSL 证书,你必须生成一个证书签署请求 (certificate signing request 简称 CSR) 。一个 CSR 主要是由一个密钥对的公钥和一些附加信息组成。当证书被签署时,这两部分都会被插入到证书中,可以从浏览器中导出证书并用在线工具查看证书的内容。

把生成的 CSR 交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成。保留好 CSR,当权威证书颁发机构颁发的证书过期的时候,你还可以用同样的 CSR 来申请新的证书,key (私钥) 保持不变。

生成 CSR

当生成 CSR 时,你会被提示输入证书相关的详细信息。这些信息被称为区分名称 (Distinguised Name 简称 DN)。DN 中的一个重要字段是通用名称 (Common Name 简称 CN),它应该是你打算使用证书的主机的完全合格域名 (Fully Qualified Domain Name 简称 FQDN),而其他信息乃非必须。如果用户未输入任何内容,则使用默认值;如果不存在默认值,则忽略该字段(留空)。即便存在默认值,仍然可以省略该字段,仅需输入 . 字符。

当生成 CSR 时,可以通过命令行或文件传递信息来跳过交互式提示。可以通过在任何请求 CSR 信息的 OpenSSL 命令中添加 -subj 选项来实现非交互式地回答 CSR 信息提示。

1
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

举例

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
# 创建一个私钥,然后从中生成一个新的CSR
openssl genpkey -algorithm RSA -out privatekey.pem -pkeyopt rsa_keygen_bits:2048
openssl req \
-new \
-key privatekey.pem \
-out req.csr \
-subj "/CN=www.zhaolq.com"
# 检查并验证证书申请
openssl req -in req.csr -text -verify -noout


# 创建一个新的CSR和一个新的私钥
openssl req \
-newkey rsa:2048 \
-nodes \
-keyout privatekey.pem \
-out req.csr \
-subj "/CN=www.zhaolq.com"
# 选项 -nodes 指定私钥没有用密码加密。在OpenSSL 3.0中,也不建议使用 -nodes 选项。使用 -noenc 代替


# 从CSR中提取公钥
openssl req -in req.csr -noout -pubkey


# 生成自签名证书/测试证书
# 【参数中带-x509表示直接生成自签证书,不带则表示生成证书签署请求】
# 生产环境中还是不要使用自签的证书,否则浏览器会不认,或者如果你是企业应用的话能够强制让用户的浏览器接受你的自签证书也行。
openssl req \
-x509 \
-days 3650 \
-newkey rsa:2048 \
-nodes \
-keyout privatekey.pem \
-out my.crt \
-subj "/CN=www.zhaolq.com"
# 根据私钥生成自签名证书
openssl req \
-x509 \
-days 3650 \
-new \
-key privatekey.pem \
-out my2.crt \
-subj "/CN=www.zhaolq.com"


# 创建一个SM2私钥,然后从中生成一个证书请求
openssl ecparam -genkey -name SM2 -out sm2.key
openssl req -new -key sm2.key -out sm2.csr -sm3 -sigopt "distid:1234567812345678"
# 检查并验证SM2证书请求
openssl req -verify -in sm2.csr -sm3 -vfyopt "distid:1234567812345678"


# 查看CSR内容
openssl req -in req.csr -text
openssl req -in req.csr -text -noout -verify

openssl-x509

此命令是多用途证书命令。它可用于显示证书信息,将证书转换为各种形式,签署证书请求(例如“mini CA”)或编辑证书信任设置。

弃用:

https://www.openssl.org/docs/manmaster/man1/x509.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-x509.html

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
# 从证书中提取公钥
openssl x509 -in cert.pem -noout -pubkey

# 显示证书内容
openssl x509 -in cert.pem -noout -text -subject
# 显示证书序列号
openssl x509 -in cert.pem -noout -serial
# 显示证书主题名称
openssl x509 -in cert.pem -noout -subject
# 以RFC2253格式显示证书主题名称
openssl x509 -in cert.pem -noout -subject -nameopt RFC2253
# 在支持UTF8的终端上以单行形式显示证书主题名称
openssl x509 -in cert.pem -noout -subject -nameopt oneline,-esc_msb
# 显示证书SHA1指纹
openssl x509 -sha1 -in cert.pem -noout -fingerprint

# 将证书从PEM转换为DER格式
openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
# 将证书从DER转换为PEM格式
openssl x509 -in cert.der -inform DER -out cert2.pem -outform PEM

# 根据私钥和证书生成CSR,将证书转换为证书请求
openssl x509 -x509toreq -in cert.pem -out req.csr -signkey privatekey.pem

# 根据私钥和CSR生成自签名证书
openssl x509 \
-req \
-in req.csr \
-out cacert.pem \
-signkey privatekey.pem \
-days 3650
# 根据私钥和CSR生成自签名证书,添加CA扩展项
openssl x509 \
-req \
-in req.csr \
-out cacert.pem \
-signkey privatekey.pem \
-extfile /etc/pki/tls/openssl.cnf \
-extensions v3_ca \
-days 3650

# 使用上面生成的 自签名证书/根证书 签署证书请求
openssl x509 \
-req \
-in req2.csr \
-out cacert2.pem \
-CA cacert.pem \
-CAkey privatekey.pem \
-CAcreateserial \
-days 3650

openssl-ca

此命令模拟CA应用程序。它可以用于以多种形式签署证书请求(CSR)并生成证书吊销列表(CRL)。

请注意,还有很多种生成证书的方法: openssl-reqopenssl-x509 命令可用于直接创建证书。

弃用:

https://www.openssl.org/docs/manmaster/man1/ca.html

推荐:

使用OpenSSL构建私有CA

https://www.openssl.org/docs/manmaster/man1/openssl-ca.html

https://www.openssl.org/docs/manmaster/man1/openssl-ca.html#DESCRIPTION

openssl-crl

处理 DER 或 PEM 格式的 证书吊销列表 (CRL) 文件。

弃用:

https://www.openssl.org/docs/manmaster/man1/crl.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-crl.html

1
2
3
4
5
6
7
8
9
# 将CRL文件从PEM转换为DER
openssl crl -in /home/crl.pem -outform DER -out /home/crl.der
# 将CRL文件从DER转换为PEM
openssl crl -inform DER -in /home/crl.der -out /home/crl2.pem

# 获取PEM证书格式的crl文本内容
openssl crl -in /home/crl.pem -text -noout
# 获取DER证书格式的crl文本内容
openssl crl -inform DER -in /home/crl.der -text -noout

openssl-verify

验证证书链

弃用:

https://www.openssl.org/docs/manmaster/man1/verify.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-verify.html

1
openssl verify -CAfile rootca.crt subcert.crt

openssl-pkcs7

弃用:

https://www.openssl.org/docs/manmaster/man1/pkcs7.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-pkcs7.html

在线导出PKCS7 P7B格式

PKCS#7结构证书可以包含多个证书。

1
2
3
4
5
6
7
8
# 将pem格式的PKCS#7结构证书转换为der格式的PKCS#7结构证书
openssl pkcs7 -inform PEM -in p7b.pem -outform DER -out p7b.der

# 将所有证书输出到一个文件中。
# 将pem格式的PKCS#7结构证书转pem证书
openssl pkcs7 -print_certs -inform PEM -in p7b.pem -out cert.pem
# 将der格式的PKCS#7结构证书转pem证书
openssl pkcs7 -print_certs -inform DER -in p7b.der -out cert.pem

openssl-crl2pkcs7

根据可选的CRL和一个或多个pem证书,转换为 PKCS#7 简并的 “certificates only” 结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 根据pem证书以无CRL的格式创建PEM格式的PKCS#7结构证书
openssl crl2pkcs7 -nocrl -certfile cert.pem -out p7b.pem
# 根据可选的CRL和pem证书创建PEM格式的PKCS#7结构证书
openssl crl2pkcs7 -in crl.pem -certfile cert.pem -out p7b.pem

# 从几种不同的pem证书中以无CRL的格式创建PEM格式的PKCS#7结构
openssl crl2pkcs7 \
-nocrl \
-certfile cert1.pem \
-certfile cert2.pem \
-outform PEM \
-out p7b.pem
# 从几种不同的pem证书中以无CRL的格式创建DER格式的PKCS#7结构
openssl crl2pkcs7 \
-nocrl \
-certfile cert1.pem \
-certfile cert2.pem \
-outform DER \
-out p7b.der

openssl-pkcs12

创建和解析 PKCS#12 文件(有时称为PFX文件)。PKCS#12 文件被 Netscape、MSIE 和 MS Outlook 等多个程序使用。

弃用:

https://www.openssl.org/docs/manmaster/man1/pkcs12.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-pkcs12.html

在线导出PFX、PKCS12

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
# 解析PKCS#12文件并将其输出到PEM文件
openssl pkcs12 -in cert.pfx -out file.pem
# 不加密私钥。由于openssl版本不同,选择以下一种方式。
openssl pkcs12 -in cert.pfx -out file.pem -nodes
openssl pkcs12 -in cert.pfx -out file.pem -noenc
# 仅将客户端证书输出到文件
openssl pkcs12 -in cert.pfx -clcerts -out file.pem

# 打印有关PKCS#12文件的一些信息
openssl pkcs12 -in cert.pfx -info -noout
openssl pkcs12 -in cert.pfx -info -noout -legacy # 旧版模式下打印

# 从PEM文件创建一个PKCS#12文件,该文件可能包含私钥和证书
openssl pkcs12 -export -nokeys -in cert.pem -out cert.pfx # 仅包含证书
openssl pkcs12 -export -nocerts -inkey privatekey.pem -out cert.pfx # 仅包含私钥
# 将证书和私钥打包为pkcs12格式文件
openssl pkcs12 -export -in cert.pem -inkey privatekey.pem -out cert.pfx

# 包括一些额外的证书
openssl pkcs12 \
-export \
-nokeys \
-in cert.pem \
-out cert.pfx \
-certfile cert2.pem \
-certfile cert3.pem

openssl-ecparam

EC参数操作和生成

椭圆曲线

openssl-pkeyutl

用于使用任何受支持的算法执行加密、解密、签名、验签等操作。

弃用:

https://www.openssl.org/docs/manmaster/man1/rsautl.html

https://www.openssl.org/docs/manmaster/man1/openssl-rsautl.html

https://www.openssl.org/docs/manmaster/man1/pkeyutl.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-pkeyutl.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 公钥加密
openssl pkeyutl -encrypt -inkey publickey.pem -pubin -in test.txt -out test_enc.txt

# 私钥解密
openssl pkeyutl -decrypt -inkey privatekey.pem -in test_enc.txt -out test_dec.txt

# 私钥签名,文件不能比密钥长
openssl pkeyutl -sign -inkey privatekey.pem -in test.txt -out test_sign.txt
# 恢复已签名的数据
openssl pkeyutl -verifyrecover -inkey privatekey.pem -in test_sign.txt

# 公钥验签
openssl pkeyutl -verify -inkey publickey.pem -pubin -in test.txt -sigfile test_sign.txt
# 私钥验签
openssl pkeyutl -verify -inkey privatekey.pem -in test.txt -sigfile test_sign.txt

openssl-dgst

执行摘要操作

此命令以十六进制输出一个或多个文件的消息摘要,并使用消息摘要生成并验证数字签名。

通用名称openssl dgst可以与指定要使用的算法的选项一起使用。默认摘要为sha256。受支持的摘要名称也可以用作子命令名称。要查看支持的算法列表,请使用openssl list -digest-commands

弃用:

https://www.openssl.org/docs/manmaster/man1/dgst.html

推荐:

https://www.openssl.org/docs/manmaster/man1/openssl-dgst.html

1
2
3
4
5
6
7
8
9
10
11
12
# openssl dgst [-算法名称] [-其他选项] inputfile

# 摘要计算,默认md5的十六进制编码
openssl dgst file1.txt file2.txt file3.txt

# 计算sha256文件消息摘要,以十六进制编码输出
openssl dgst -sha256 -hex file.txt

# 使用SHA-256和二进制文件输出签名文件
openssl dgst -sha256 -sign privatekey.pem -out signature.sign file.txt
# 使用对应的公钥和摘要算法来验证签名
openssl dgst -sha256 -verify publickey.pem -signature signature.sign file.txt

Java Keytool工具管理证书

推荐链接:

http://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

Java制作证书的工具keytool用法总结

常用的Java Keytool Keystore命令

keytool是 Java 提供的密钥、证书和证书库管理工具。可以完成生成密钥,生成证书等各种操作。

keytool的子命令如下:

-certreq     生成证书请求
-changealias   更改条目的别名
-delete      删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

还可以使用 keytool -command_name -help 查看各个子命令的帮助信息

OpenPGP

OpenPGP 数据加解密标准(RFC 4880)。

PGP(英语:Pretty Good Privacy,直译:优良保密协议)是一套用于讯息加密、验证的应用程序。主要开发者菲尔·齐默曼,于1991年将PGP在互联网上免费发布。PGP本身是商业应用程序,或者说是 OpenPGP 标准的闭源实现。PGP及其同类产品均遵守OpenPGP数据加解密标准(RFC 4880)。

GnuPG(GPG)是一个密码学软件,用于加密签名通信内容及管理非对称密码学的密钥。GnuPG是自由软件,遵循IETF订定的OpenPGP技术标准设计,并与PGP保持兼容。

GUI

https://www.openpgp.org/software/kleopatra/

GnuPG应用程序支持

Gpg4win

PGP

PGP是OpenPGP标准的闭源商业版本。pgp提供了图形化工具和命令行工具,命令行工作主要有以下几个:

  • pgpk.exe 密钥生成和管理
  • pgpe.exe 加密
  • pgps.exe 签名
  • pgpv.exe 解密和校验
  • pgpo.exe 模拟2.6.3老版本命令行方式
1
2
3
4
5
6
7
8
9
10
11
pgpk -g                                                      #交互式生产密钥
pgpk -x keyname [-o pubkeyfile] #导出公钥
pgpk -a pubkeyfile #将密钥加入密钥环(pubring.pkr文件)
pgpk -r keyname #从密钥环删除公钥
pgpe -r keyname originfile [-o encryedfile] [-a] #加密,-a表示生成ASCII文档而不是二进制
pgpv encrypedfile -o decryedfile #解密(需要密钥密码)
pgps -u keyname originfile [-o signedfile] [-a] #签名(需要密钥密码),-a表示生成ASCII文档而不是二进制
pgpv signedfile #签名验证并恢复原始文件

pgp -ka KEYS #导入密钥
pgp file.asc #验证签名

GPG

Windows版下载并安装:

https://www.gnupg.org/download/index.html

https://www.gnupg.org/download/mirrors.html

支持GPG的应用程序、前端及浏览器扩展:

GnuPG - 维基百科 - 应用程序支持

官方手册:

https://gnupg.org/documentation/manuals/gnupg/

archlinux:

GnuPG (简体中文)

链接:

GPG 入门教程 - 阮一峰

GPG 的正确使用姿势

用 PGP 保护代码完整性(一): 基本概念和工具

用 PGP 保护代码完整性(二):生成你的主密钥

用 PGP 保护代码完整性(三):生成 PGP 子密钥

用 PGP 保护代码完整性(四):将主密钥移到离线存储中

用 PGP 保护代码完整性(五):将子密钥移到一个硬件设备中

用 PGP 保护代码完整性(六):在 Git 上使用 PGP

公钥服务器:

https://keys.openpgp.org/

https://keyserver.ubuntu.com/

命令

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
gpg --version
gpg --help # 帮助信息

Syntax: gpg [options] [files]
Sign, check, encrypt or decrypt
Default operation depends on the input data

Commands:

-s, --sign make a signature
--clear-sign make a clear text signature
-b, --detach-sign make a detached signature
-e, --encrypt encrypt data
-c, --symmetric encryption only with symmetric cipher
-d, --decrypt decrypt data (default)
--verify verify a signature
-k, --list-keys list keys
--list-signatures list keys and signatures
--check-signatures list and check key signatures
--fingerprint list keys and fingerprints
-K, --list-secret-keys list secret keys
--generate-key generate a new key pair
--quick-generate-key quickly generate a new key pair
--quick-add-uid quickly add a new user-id
--quick-revoke-uid quickly revoke a user-id
--quick-set-expire quickly set a new expiration date
--full-generate-key full featured key pair generation
--generate-revocation generate a revocation certificate
--delete-keys remove keys from the public keyring
--delete-secret-keys remove keys from the secret keyring
--quick-sign-key quickly sign a key
--quick-lsign-key quickly sign a key locally
--quick-revoke-sig quickly revoke a key signature
--sign-key sign a key
--lsign-key sign a key locally
--edit-key sign or edit a key
--change-passphrase change a passphrase
--export export keys
--send-keys export keys to a keyserver
--receive-keys import keys from a keyserver
--search-keys search for keys on a keyserver
--refresh-keys update all keys from a keyserver
--import import/merge keys
--card-status print the card status
--edit-card change data on a card
--change-pin change a card's PIN
--update-trustdb update the trust database
--print-md print message digests
--server run in server mode
--tofu-policy VALUE set the TOFU policy for a key

Options:

-a, --armor create ascii armored output,输出ASCII文本
-r, --recipient USER-ID encrypt for USER-ID
-u, --local-user USER-ID use USER-ID to sign or decrypt
-z N set compress level to N (0 disables)
--textmode use canonical text mode
-o, --output FILE write output to FILE
-v, --verbose verbose
-n, --dry-run do not make any changes
-i, --interactive prompt before overwriting
--openpgp use strict OpenPGP behavior

(See the man page for a complete listing of all commands and options)

Examples:

-se -r Bob [file] sign and encrypt for user Bob
--clear-sign [file] make a clear text signature
--detach-sign [file] make a detached signature
--list-keys [names] show keys
--fingerprint [names] show fingerprints

下文的 [fpr] 是指 密钥的完整指纹密钥ID (指纹简短形式) 。

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
# 密钥生成,版本不同命令有差异
gpg --gen-key
gpg --full-gen-key
gpg --full-generate-key # 2.1.17或更高版本

# 列出您拥有其公钥和私钥的GPG密钥
gpg --list-secret-keys --keyid-format LONG
gpg --list-keys [fpr] # 或者 gpg -k
gpg --homedir=E:\work\keys\GPGkeys\gnupg-backup --list-keys
gpg --homedir=E:\work\keys\GPGkeys\gnupg-backup --list-secret-keys --keyid-format LONG

# 吊销证书位置:C:\Users\Administrator\AppData\Roaming\gnupg\openpgp-revocs.d

# 生成子密钥,使用GPG选项 --edit-key + 密钥名称,然后输入GPG命令 addkey
gpg --edit-key [fpr] # 进入菜单模式
gpg> addkey
gpg> save

# 主密钥和子密钥导出的公钥内容相同,因为公钥中包含主密钥和所有子密钥信息,子密钥越多,公钥越长

# 备份公钥,加上-a的参数则输出文本格式的信息,否则输出的是二进制格式信息。
gpg --export --armor/-a [fpr]
gpg -o G:\pub_gpg_key.pem --export -a [fpr]
# 备份主密钥
gpg -o G:\pvt_gpg_key.pem --export-secret-keys -a [fpr]
# 备份子密钥
gpg -o G:\pvt_gpg_key_sub.pem --export-secret-subkeys -a [fpr]

# 导出吊销证书
gpg --generate-revocation [fpr] # 会输出到控制台
mv ~/.gnupg/openpgp-revocs.d/54DCC0B75E75EA5E1BF94D861DCB323919998133.rev /home/revoke.rev # Linux
mv ~\AppData\Roaming\gnupg\openpgp-revocs.d/54DCC0B75E75EA5E1BF94D861DCB323919998133.rev G:\revoke.rev # Windows

实战

管理提交签名验证 - github-docs — github docs —

Git 工具 - 签署工作

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
PS C:\WINDOWS\system32> gpg --full-generate-key # 具体步骤略

PS C:\WINDOWS\system32> gpg --list-secret-keys --keyid-format LONG
C:/Users/Administrator/AppData/Roaming/gnupg/pubring.kbx
--------------------------------------------------------
sec rsa4096/470D31D4158CA17A 2021-02-04 [SC]
5C7B2D23024A8256CBFE979B470D31D4158CA17A
uid [ultimate] zhaolq <hello@zhaolq.com>
ssb rsa4096/971CEBBA067D3D05 2021-02-04 [E]

PS C:\WINDOWS\system32> gpg --export --armor 470D31D4158CA17A # 将GPG密钥添加到GitHub帐户。
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=VnWZ
-----END PGP PUBLIC KEY BLOCK-----

PS F:\blog> git config --local user.signingkey 470D31D4158CA17A # 在Git中设置GPG签名密钥
PS F:\blog> git config --local commit.gpgsign true # Git客户端配置为默认对本地仓库的提交签名
PS F:\blog> git config --global gpg.program "D:\Program Files (x86)\GnuPG\bin\gpg.exe" # 配置Git的gpg程序位置

PS F:\blog> git commit -S -am "update" # 对提交签名,S大写
PS F:\blog> git log --show-signature # 查看及验证这些签名
PS F:\blog> git log --pretty="format:%h %G? %aN %s"

PS F:\blog> git tag -s mytag # 对标记签名
PS F:\blog> git tag -v mytag# 验证您签名的标记

github 提交记录会显示 Verified :

image-20210205114905816

备份 GnuPG 目录

备份整个 GnuPG 目录 C:\Users\Administrator\AppData\Roaming\gnupg

1
2
cp -rp ~/.gnupg [/media/disk/name]/gnupg-backup
cp C:\Users\Administrator\AppData\Roaming\gnupg\* G:\gnupg-backup

现在,用如下的命令去测试一下,确保它们能够正常地工作:

1
gpg --homedir=[/media/disk/name]/gnupg-backup --list-keys [fpr]

GPG 目录位置及配置文件: archlinux

使用 GPG 密钥进行 SSH 认证

https://blog.hcl.moe/archives/2463

https://blog.csdn.net/cumj63710/article/details/107413048

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 创建身份验证子密钥

$ gpg --list-secret-keys --keyid-format LONG
C:/Users/Administrator/AppData/Roaming/gnupg/pubring.kbx
--------------------------------------------------------
sec rsa4096/589DE5E731D03D76 2021-02-05 [SC]
68BC86DA54D229E8E48E9B69589DE5E731D03D76
uid [ultimate] zhaolq <hello@zhaolq.com>
ssb rsa4096/9F4F8FE0C5CD582E 2021-02-05 [E]

$ gpg --expert --edit-key 589DE5E731D03D76 # --expert专家模式
gpg (GnuPG) 2.2.25; Copyright (C) 2020 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec rsa4096/589DE5E731D03D76
created: 2021-02-05 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/9F4F8FE0C5CD582E
created: 2021-02-05 expires: never usage: E
[ultimate] (1). zhaolq <hello@zhaolq.com>

gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt # 默认包含签名、加密功能

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? s # 切换签名功能

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt # 切换后,签名功能被移除,再次切换将添加。

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? e # 切换加密功能

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? a # 切换身份验证功能

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate # 只保留身份验证功能

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? q # 完成退出
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec rsa4096/589DE5E731D03D76
created: 2021-02-05 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/9F4F8FE0C5CD582E
created: 2021-02-05 expires: never usage: E
ssb rsa4096/AC4513B607AD3D19
created: 2021-03-01 expires: never usage: A
[ultimate] (1). zhaolq <hello@zhaolq.com>

gpg> save
$

未完待续…

PuTTY工具

PuTTY - 维基百科

https://www.putty.org/

PuTTY 包含多个工具:

1
2
3
4
5
6
pageant.exe   # SSH认证代理,(PuTTY、PSCP、PSFTP、Plink都会用到)
plink.exe # PuTTY后端的命令行接口
pscp.exe # SCP客户端
psftp.exe # SFTP客户端
putty.exe # telnet和SSH客户端
puttygen.exe # RSA和DSA密钥生成转换工具

puttygen 使用的密钥存储格式类似于 OpenSSL(密钥文件扩展名.ppk,其中同时包含公钥和私钥)。

公钥格式:

1
2
3
4
5
---- BEGIN SSH2 PUBLIC KEY ----
Comment: ""
AAAAB3NzaC1yc2EAAAABJQAAAEEAhqCvOfHc/GBBoTkJhSkqkqFOxCLFT9DHl/6a
dovX5wYcgwp1RXO7QC4XScHkOo06boRRtEySR4J8nijsKFjijw==
---- END SSH2 PUBLIC KEY ----
1
2
# 前面加 ssh-rsa 即为 OpenSSH 公钥 (用于配置SSH连接)
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAEEAhqCvOfHc/GBBoTkJhSkqkqFOxCLFT9DHl/6adovX5wYcgwp1RXO7QC4XScHkOo06boRRtEySR4J8nijsKFjijw==

私钥格式 (.ppk)

1
2
3
4
5
6
7
8
9
10
11
12
PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment:
Public-Lines: 2
AAAAB3NzaC1yc2EAAAABJQAAAEEAhqCvOfHc/GBBoTkJhSkqkqFOxCLFT9DHl/6a
dovX5wYcgwp1RXO7QC4XScHkOo06boRRtEySR4J8nijsKFjijw==
Private-Lines: 4
AAAAQFr28u/M70K9lCDTgvkb0KhDemjZOTXt7qT4Iy2BFVbncROWVteOUUSKl1B8
NBsbVpU5eo1/vMu6f7jnMgY0WfUAAAAhAO99bZ1eTv0fhGSoGRgjspEpV+JsnCWH
vqVRGkM6Khv1AAAAIQCP6J+fDoVQF2Gz91dgQKf17XD3V4z5K9jIWh7kA7hV8wAA
ACA+w2FZsWTlS6mhqUZunVvTUwwZtwKzDhnW40TrfWylGw==
Private-MAC: 69c717a3b3062220562d33c5b8c3e82949be8642

image-20201207180058631

image-20201209172045671

Export OpenSSH key 导出旧格式的 OpenSSH 密钥,以 -----BEGIN RSA PRIVATE KEY----- 开头。多次导出的密钥总是一致的。

Export OpenSSH key (force new file format) 导出新格式的 OpenSSH 密钥,以 -----BEGIN OPENSSH PRIVATE KEY----- 开头。每次导出的密钥都略有不同,多次实践后猜测:时间和工具都是导致密钥不同的因素。但是,略有不同的密钥都是合法。

save private key 保存 PuTTY 的密钥格式 ( .ppk )。

save public key 保存 SSH2 公钥。程序主界面中显示的是 OpenSSH 格式公钥。

MobaXterm工具

SSH key generator:

image-20201208092705620

在线工具

一般在线生成的公钥和私钥都是 pem 格式 PKCS#8 标准。

https://www.ssleye.com/pass_double.html

https://www.devglan.com/online-tools/rsa-encryption-decryption

image-20201208141647141

PKCS#8 标准的私钥开头和结尾加入 -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- 就成了 PEM 文件格式

1
2
3
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI/LbpFa8A4P9uUkt3kSNysEL1MVBLnsFO16cVIfjiYpLfmwrZMN8Z6RRu0OeYTu83+0BV68ghZoHpDLUw1waWG6P74wgx7KTz1CzlR1ex3dTXhd04UGqHW5EvG7l0oxtBqeH9S2kb/3ubNJ9W3JXa8iC+mNbWM1C8AKbKH0zrkVAgMBAAECgYBYp5419BFJOkKIqIiOFtL4rI3Y9X6CerG0cOdpMJddo8n6xhleLxynHP7TrTby5LgwJfehnyu9UNh3gURlZscxSTuh3+jCAEZn5yZB3+hJLMt0T9VN+NOmPA3UBLuNIc0qJhkFB8NQ5sFKJvQB9n35AJsqImqJjTINObrzLPVGQQJBAP//o07VnH2YZJP+otYpUICN0zTAZxWKsWceDhE85LS9KNOrpnNjP68GRL2wfd0G5vL0IFcDqtYoYCjQTya8oQkCQQCPy6KiDP0Kc/c5RUChbAZtaFHTRDhFrMG5cYMOJJt1rTxAqGRwuGzIQzVSiZXAHcORYkBDS6a1XDgH+n3P7jatAkBBxaZprMxGII9Gztd7eqXqQYYQOZbCnB20Rq6Kk0CXhzokGCft4YQNLekfa2cLEKjppvtgH9sWpsz973dGlpQxAkA/WA9On7YgkrFHk1BDS9kQ/TF+hcDcQJweWvjGlC2/iw7N1OBaH4QcPC8TKvTC6tmqA8QXYQ4ROoycRyaBIIkJAkEA0+kdSBFoD8oh+yvTOQJKrgTO69h6b0TdT2o4bALo+EeNgCEAJMILK78Qa81QjMOOZ3xn9Vlw2Uo01YSzIoVh3Q==
-----END PRIVATE KEY-----

要想查看编码类型可转换为 PKCS#1 标准:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCPy26RWvAOD/blJLd5EjcrBC9TFQS57BTtenFSH44mKS35sK2T
DfGekUbtDnmE7vN/tAVevIIWaB6Qy1MNcGlhuj++MIMeyk89Qs5UdXsd3U14XdOF
Bqh1uRLxu5dKMbQanh/UtpG/97mzSfVtyV2vIgvpjW1jNQvACmyh9M65FQIDAQAB
AoGAWKeeNfQRSTpCiKiIjhbS+KyN2PV+gnqxtHDnaTCXXaPJ+sYZXi8cpxz+0602
8uS4MCX3oZ8rvVDYd4FEZWbHMUk7od/owgBGZ+cmQd/oSSzLdE/VTfjTpjwN1AS7
jSHNKiYZBQfDUObBSib0AfZ9+QCbKiJqiY0yDTm68yz1RkECQQD//6NO1Zx9mGST
/qLWKVCAjdM0wGcVirFnHg4RPOS0vSjTq6ZzYz+vBkS9sH3dBuby9CBXA6rWKGAo
0E8mvKEJAkEAj8uiogz9CnP3OUVAoWwGbWhR00Q4RazBuXGDDiSbda08QKhkcLhs
yEM1UomVwB3DkWJAQ0umtVw4B/p9z+42rQJAQcWmaazMRiCPRs7Xe3ql6kGGEDmW
wpwdtEauipNAl4c6JBgn7eGEDS3pH2tnCxCo6ab7YB/bFqbM/e93RpaUMQJAP1gP
Tp+2IJKxR5NQQ0vZEP0xfoXA3ECcHlr4xpQtv4sOzdTgWh+EHDwvEyr0wurZqgPE
F2EOETqMnEcmgSCJCQJBANPpHUgRaA/KIfsr0zkCSq4EzuvYem9E3U9qOGwC6PhH
jYAhACTCCyu/EGvNUIzDjmd8Z/VZcNlKNNWEsyKFYd0=
-----END RSA PRIVATE KEY-----

格式

目前主流的密钥(或者说私钥)格式有两种:

  • OpenSSH 的密钥格式 ( pem 或无后缀) : 新文件格式以 -----BEGIN OPENSSH PRIVATE KEY----- 开头;旧文件格式以 -----BEGIN RSA PRIVATE KEY----- 开头,使用 PKCS#1 标准。
  • PuTTY 的密钥格式 ( ppk )ppk 是 PuTTY Private Key 的缩写。

公钥密码学标准 (PKCS) - 维基百科 :公开密钥密码编译标准

PKCS 1 - 维基百科 :定义了RSA公钥和私钥必须具有的数学定义和属性(专为 RSA 密钥定义的)。多用于JS等其它程序加解密,属于比较旧的格式标准。

PKCS 8 - 维基百科 :与 PKCS#1 相比,从本质上说,PKCS#8 格式增加验证数据段,保证密钥正确性。多用于JAVA、PHP程序加解密中,为目前用的比较多的密钥、证书格式,也用于微信RSA等程序;

ASN.1 - 维基百科

PEM格式 (PKCS#1标准)

Privacy-Enhanced Mail (PEM) - 维基百科 :是公私钥和证书常用的一种文件格式 (存储格式)。用 BEGIN 和 END 标签确定已编码消息的类型,开头类似 -----BEGIN RSA PRIVATE KEY----- 、结尾类似 -----END RSA PRIVATE KEY----- ,中间存放 Base64 编码的二进制数据。

PEM格式 (PKCS#1标准):

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
# 私钥
-----BEGIN RSA PRIVATE KEY-----
MIIBOAIBAAJBAISRPuae1mSLzVrxMmfvUtY1+2LLXmCn1z1Oe+MDKDR1jmqba/6V
aXYWwW3L7KC7BAc2io7T1L/dPS6KObrLIK8CASUCQDIpHrggbMwZOPH6Zhl9JkM3
BSxM80cqwCUI8JsV84l4B0wdaREMjV4Gf/SSdME/upFLbEQqlY3edVgi4BXf640C
IQDqQv9SqOLhDkMqDZG9b8/PHT7MhWmnFzZ/Jptciojf5wIhAJDecvFffxLKwmnH
kozpC+xp+Y2eZ1lD/2NV29YbBL/5AiEA0O+lczyurQy4cZ1mTwLb8BMqLAhJeVnk
fz4b3OpCudsCIFYjZvBiS46iErtvvuwAMJpohouOnlDApbCvl3hjF5S9AiAysGca
+E16TkxCeXu84WJ59C1PZSOE4w+cQHOO9+3xqg==
-----END RSA PRIVATE KEY-----

# 公钥
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEArKlXb4I1tgh2P0fUuYzpGUHCYcxC3EkGuEdhLVWsYxmypSy5RfTb
soolk3UlzuevW6SYB6KDdBautb9VKNx9QUWJKFG7bYFxhGXUFIF72W6CvKpzFs/G
Uqp9GinG4EzyRhrhKVOzV3tr0C0fl2gm2azDYtIw7gGVvcVoebCrCfiQUGX7i1Hk
BH/s2sTi9rBaBzq6/W1SKEiBrhiik+vApE80A+6e1OAljmGmagbKgmvCjDPeFJPE
PVakiTiBlcHZ+wckXbeCzuGu7ZqA5AKExrebSb3K7kLHbKyvA9fMXiWdV/ofGnek
EURsPzNyo5S16T/kTBnN3VMjEqelTJecru1LjsbbAyOi/Sox+HcNi0LqrHHzzj4A
LysZhU+FyLQRUYziUjRzxHEE//tAI7b2/KObe58ENlQndoPrjmovhRVecQzQR2k4
kVVY/xHWYymk4jtgmsw7wvGomyu8fGq6AMri1tiXOcU6VGllBxeAMFaMOpOtf20q
mpteVKNOlVSrCGC+akVpzlLvURae7dKY85xRZHxNCO/mEbYpDzLg1B8k+qWnR2eg
eEt8q2x8i3P9gz96QPnfTvD8lAXQQzijVKKXvvo63S/9DLG7BS4P/7CoQhFEW5TM
EWtFyBC7vFSWordrOz0P4qmyFit2EhoKReHxpLT0PIpwG/pLKVON1A0CAwEAAQ==
-----END RSA PUBLIC KEY-----

OpenSSL生成的 密钥文件(.pem)、签发请求文件(.csr)、证书文件(.cer) 都是用 PEM文件格式

扩展名可能为 .pem.crt.cer.key

PEM格式 (PKCS#8标准)

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
# 私钥
-----BEGIN PRIVATE KEY-----
MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAhJE+5p7WZIvNWvEy
Z+9S1jX7YsteYKfXPU574wMoNHWOaptr/pVpdhbBbcvsoLsEBzaKjtPUv909Loo5
ussgrwIBJQJAMikeuCBszBk48fpmGX0mQzcFLEzzRyrAJQjwmxXziXgHTB1pEQyN
XgZ/9JJ0wT+6kUtsRCqVjd51WCLgFd/rjQIhAOpC/1Ko4uEOQyoNkb1vz88dPsyF
aacXNn8mm1yKiN/nAiEAkN5y8V9/EsrCaceSjOkL7Gn5jZ5nWUP/Y1Xb1hsEv/kC
IQDQ76VzPK6tDLhxnWZPAtvwEyosCEl5WeR/Phvc6kK52wIgViNm8GJLjqISu2++
7AAwmmiGi46eUMClsK+XeGMXlL0CIDKwZxr4TXpOTEJ5e7zhYnn0LU9lI4TjD5xA
c4737fGq
-----END PRIVATE KEY-----

# 公钥
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArKlXb4I1tgh2P0fUuYzp
GUHCYcxC3EkGuEdhLVWsYxmypSy5RfTbsoolk3UlzuevW6SYB6KDdBautb9VKNx9
QUWJKFG7bYFxhGXUFIF72W6CvKpzFs/GUqp9GinG4EzyRhrhKVOzV3tr0C0fl2gm
2azDYtIw7gGVvcVoebCrCfiQUGX7i1HkBH/s2sTi9rBaBzq6/W1SKEiBrhiik+vA
pE80A+6e1OAljmGmagbKgmvCjDPeFJPEPVakiTiBlcHZ+wckXbeCzuGu7ZqA5AKE
xrebSb3K7kLHbKyvA9fMXiWdV/ofGnekEURsPzNyo5S16T/kTBnN3VMjEqelTJec
ru1LjsbbAyOi/Sox+HcNi0LqrHHzzj4ALysZhU+FyLQRUYziUjRzxHEE//tAI7b2
/KObe58ENlQndoPrjmovhRVecQzQR2k4kVVY/xHWYymk4jtgmsw7wvGomyu8fGq6
AMri1tiXOcU6VGllBxeAMFaMOpOtf20qmpteVKNOlVSrCGC+akVpzlLvURae7dKY
85xRZHxNCO/mEbYpDzLg1B8k+qWnR2egeEt8q2x8i3P9gz96QPnfTvD8lAXQQzij
VKKXvvo63S/9DLG7BS4P/7CoQhFEW5TMEWtFyBC7vFSWordrOz0P4qmyFit2EhoK
ReHxpLT0PIpwG/pLKVON1A0CAwEAAQ==
-----END PUBLIC KEY-----

OpenSSH公钥

1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNk6kAECG4G4Ukpvqgew2ihAfRqueAlGu/jIBVndFnhseiLXeK0SPS7IIvH45AeTYE3eViqj1ehUHJC6pA5CLNraSK7GV3lG6F3IihWv702ucT5/jp1jm5z5qHHyZqC2OYgOkJJZ3/2HfuF+Dxpw29MSH6v/qKBs0KSwV0Dyfhqw== hello@zhaolq.com

SSH2公钥

1
2
3
4
5
6
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "1024-bit RSA, converted by root@zlq from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAAAgQC90f/TqKJEeHfZtTOWzUw8oi7m8VnXFyCfT4oQkN
Z35376K19zvHtGQPv2JZPTgRJ9GHoP454MBBMbAbDBeh4V1Wgzu1U63vLH2xGekSXpr0+4
K0fg/04PD5aU5xnDuTVtdydDP6wfs0phdddyPaakBCo/JuFpgUxQJxFCO/a4sQ==
---- END SSH2 PUBLIC KEY ----

DER格式

所有类型的证书和私钥都能用 DER 格式存放。文件中直接存储二进制数据,未进行Base64编码,无可读性的描述文字。

Java 和 Windows 服务器偏向于使用这种编码格式.

扩展名可能为 .der.cercrt

P7B/PKCS#7文件 (PEM)

包含 -----BEGIN PKCS----------END PKCS7----- 字符串,只能存储证书和链证书,不能存放私钥。可以包含多个证书。内容经过 Base64 编码。

扩展名可能为 .p7b.p7c

PFX/PKCS#12文件 (PEM)

可以加密的文件,可在一个文件中存放多个证书或密钥,主要用于证书和私钥的导入导出。

扩展名一般为 .pfx.p12

格式转换

PEM转DER

1
2
3
4
5
6
# 转换私钥格式(PEM->DER)
openssl pkey -in key.pem -outform DER -out keyout.der
# 将证书从PEM转换为DER格式
openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
# 将CRL文件从PEM转换为DER
openssl crl -in /home/crl.pem -outform DER -out /home/crl.der

DER转PEM

1
2
3
4
5
6
# 转换私钥格式(DER->PEM)
openssl pkey -in key.der -inform der -out keyout.pem
# 将证书从DER转换为PEM格式
openssl x509 -in cert.der -inform DER -out cert2.pem -outform PEM
# 将CRL文件从DER转换为PEM
openssl crl -inform DER -in /home/crl.der -out /home/crl2.pem

PEM证书格式转P7B

openssl-crl2pkcs7 命令

P7B证书格式转PEM

openssl-pkcs7 命令

PEM证书格式转PFX

openssl-pkcs12 命令

PFX证书格式转PEM

openssl-pkcs12 命令

P7B证书格式转PFX (先转成PEM)

1
2
openssl pkcs7 -print_certs -inform PEM -in p7b.pem -out cert.pem
openssl pkcs12 -export -in cert.pem -inkey privatekey.pem -out cert.pfx -certfile cert2.pem

ppk与pem(PKCS#1)转换

利用putty工具

PKCS1与PKCS8转换

利用在线工具: https://www.ssleye.com/pkcs.html

支持公钥、私钥的PKCS1与PKCS8之间的相互转换,及PEM格式输出:

SSH2公钥与OpenSSH公钥转换

1
2
$ ssh-keygen -e -f openssh.pub > ssh2.pub # OpenSSH公钥转换为SSH2公钥
$ ssh-keygen -i -f ssh2.pub > openssh.pub # SSH2公钥转换为OpenSSH公钥

SSH2公钥:

1
2
3
4
5
---- BEGIN SSH2 PUBLIC KEY ----
Comment: ""
AAAAB3NzaC1yc2EAAAABJQAAAEEAhqCvOfHc/GBBoTkJhSkqkqFOxCLFT9DHl/6a
dovX5wYcgwp1RXO7QC4XScHkOo06boRRtEySR4J8nijsKFjijw==
---- END SSH2 PUBLIC KEY ----

OpenSSH公钥 (用于配置SSH连接):

1
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAEEAhqCvOfHc/GBBoTkJhSkqkqFOxCLFT9DHl/6adovX5wYcgwp1RXO7QC4XScHkOo06boRRtEySR4J8nijsKFjijw==