JDK 自签证书
Certbot
###### 安装
yum install epel-release -y
yum install certbot -y
## windows安装
## https://link.zhihu.com/?target=https%3A//github.com/certbot/certbot/releases/latest/download/certbot-beta-installer-win_amd64_signed.exe
###### 申请证书
# 泛域名:
certbot certonly -d *.test.com --manual --preferred-challenges dns
# 主域名:
certbot certonly -d test.com --manual --preferred-challenges dns
## 如果成功的话,它会生成两个文件:
ls /etc/letsencrypt/live/test.com/fullchain.pem
ls /etc/letsencrypt/live/test.com/privkey.pem
###### 续期
certbot certonly -d *.test.com --manual --preferred-challenges dns
###### 自动续期
## 这里推荐 @justjavac 大佬写的,https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fjustjavac%2Fcertbot-dns-aliyun
## 泛域名
certbot certonly -d *.test.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
## 续费命令
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
## 利用 crontab 定时任务,每天执行一下自动续期。
1 1 */1 * * root certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --deploy-hook "nginx -s reload"
keytool可视化工具
证书格式
*.DER或*.CER文件
: 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。*.CRT文件
: 这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与 .DER及.CER证书文件相同。*.PEM文件
: 这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。 .PEM 文件如果只包含私钥,一般用.KEY文件代替。*.PFX或*.P12文件
: 这样的证书文件是二进制格式,同时包含证书和私钥,且一般有密码保护。可以使用记事本直接打开。
密钥库文件格式【Keystore】
keytool 命令
keytool
- genkey
- alias tomcat
(别名)- keypass 123456
(别名密码)- keyalg RSA
(生证书的算法名称,RSA是一种非对称加密算法)- keysize 2048
(密钥长度,证书大小)- validity 365
(证书有效期,天单位)- keystore ./tomcat.keystore
(指定生成证书的位置和证书名称)- storepass 123456
(获取keystore信息的密码)- storetype PKCS12
(指定密钥仓库类型)
# 生成证书 使用JDK自带的工具keytool (keytool -genkeypair)
keytool -genkey -alias caskeystore -keyalg RSA -keystore thekeystore \
-storepass 123456 -keypass 123456 \
-dname "CN=cas.alot.pw, OU=bjtxra,OU=com,S=BJ,C=CN" \
-ext SAN="dns:localhost,ip:127.0.0.1"
# 查看证书信息
keytool -list -keystore thekeystore
# 导出数字证书
keytool -export -alias caskeystore -storepass 123456 -keystore thekeystore -rfc -file cas.crt
# 将数字证书导入jdk下的jre里,这里导入JDK时需要默认密码 changeit
# windows:
keytool -import -alias caskeystore -keystore %JAVA_HOME%\jre\lib\security\cacerts -file cas.crt -trustcacerts -storepass changeit
# Unix:
sudo keytool -import -alias caskeystore -keystore $JAVA_HOME/jre/lib/security/cacerts -file cas.crt -trustcacerts -storepass changeit
keytool -genkeypair -alias DEV -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore server.p12 -validity 365 -storepass 123456 -keypass 123456 -dname "CN=DEV,OU=DEV,O=Asia,L=BJ,ST=BJ,C=CN" -ext san=ip:192.168.13.96,ip:127.0.0.1,dns:localhost
keytool可视化工具
keytool 命令
keytool
- genkey
- alias tomcat
(别名)- keypass 123456
(别名密码)- keyalg RSA
(生证书的算法名称,RSA是一种非对称加密算法)- keysize 2048
(密钥长度,证书大小)- validity 365
(证书有效期,天单位)- keystore ./tomcat.keystore
(指定生成证书的位置和证书名称)- storepass 123456
(获取keystore信息的密码)- storetype PKCS12
(指定密钥仓库类型)
证书格式
*.der文件
或*.cer文件
: 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。*.crt文件
: 这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与*.der
及*.cer
证书文件相同。*.pem文件
: 这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。*.pem
文件如果只包含私钥,一般用*.key
文件代替。*.pfx文件
或*.p12文件
: 证书交换格式,是二进制格式,同时包含证书和私钥,用于交换传输,且一般有密码保护。
自签名证书:用自己的私钥签发自己的公钥即主体信息生成的证书。
证书签名:对证书固定值进行hash后用密钥对中的私钥对hash值加密
keytool
#!/bin/bash
## 创建密钥对 DEV.P12
keytool -genkeypair -alias DEV -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore DEV.p12 -validity 365 -storepass 123456 -keypass 123456 -dname "CN=DEV,OU=DEV,O=Asia,L=BJ,ST=BJ,C=CN" -ext san=ip:192.168.13.96,ip:127.0.0.1,dns:localhost
## 创建密钥对 DEV.jks
keytool -genkeypair -alias DEV -keyalg RSA -keysize 2048 -storetype JKS -keystore DEV.jks -validity 365 -storepass 123456 -keypass 123456 -dname "CN=DEV,OU=DEV,O=Asia,L=BJ,ST=BJ,C=CN" -ext san=ip:192.168.13.96,ip:127.0.0.1,dns:localhost
## 创建密钥对 DEV.ks
keytool -genkeypair -alias DEV -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore DEV.ks -validity 365 -storepass 123456 -keypass 123456 -dname "CN=DEV,OU=DEV,O=Asia,L=BJ,ST=BJ,C=CN" -ext san=ip:192.168.13.96,ip:127.0.0.1,dns:localhost
## 输出证书内容
keytool -list -rfc -keystore DEV.jks -storepass 123456
## 输出公钥和证书信息
keytool -list -rfc --keystore DEV.jks -storepass 123456 | openssl x509 -inform pem -pubkey
## DEV.jks => DEV.pfx
keytool -v -importkeystore -srckeystore DEV.jks -srcstoretype JKS -srcstorepass 123456 -destkeystore DEV.pfx -deststoretype pkcs12 -deststorepass 123456 -destkeypass 123456
## 输出 DEV.pfx 的私钥内容到文件中
openssl pkcs12 -in DEV.pfx -nocerts -nodes -out DEV.private
## DEV.p12 => DEV.cer 导出数字证书
keytool -keystore ./DEV.p12 -export -alias DEV -file DEV.cer -storepass 123456
## 创建密钥 DEV.ks
keytool -genkey -alias DEV -keyalg RSA -keysize 2048 -keystore ./DEV.ks -validity 365 -storepass 123456 -dname "CN=DEV,OU=DEV,O=Asia,L=BJ,ST=BJ,C=CN" -ext san=ip:192.168.13.96,ip:127.0.0.1,dns:localhost
## 查看信息
keytool -list -v -keystore ./DEV.ks -storepass 123456
## 生成证书 DEV.cer (需要 DEV.ks) (CA)将证书安装在本地计算机的[受信任的根证书颁发机构]中
keytool -export -alias DEV -file DEV.cer -keystore ./DEV.ks -storepass 123456
## 生成证书 DEV.crt (需要 DEV.ks) 将证书安装在本地计算机的[受信任的根证书颁发机构]中
keytool -export -alias DEV -file DEV.crt -keystore ./DEV.ks -storepass 123456
## 生成证书签名请求(CSR文件)
keytool -certreq -alias DEV -file DEV.csr -keystore DEV.ks -storepass 123456
---
## 使用CA证书给golove证书签名,即用CA的私钥签名后与golove的公钥生成一个证书
keytool -gencert -alias DEV -keystore DEV.ks -infile DEV.csr -outfile DEV.crt
---
## 输出公钥内容和证书内容
keytool -list -rfc --keystore DEV.ks -storepass 123456 | openssl x509 -inform pem -pubkey
## 输出私钥内容
openssl pkcs12 -in DEV.ks -nocerts -nodes -out DEV.private
---
## jks转换为keystore
keytool -importkeystore -srckeystore e:/keystore/app.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore e:/keystore/app.p12
keytool -v -importkeystore -srckeystore e:/keystore/app.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore e:/keystore/app.keystore
## keystore转换为jks
keytool -importkeystore -srckeystore e:/keystore/app.keystore -srcstoretype JKS -deststoretype PKCS12 -destkeystore e:/keystore/app.p12
keytool -v -importkeystore -srckeystore e:/keystore/app.p12 -srcstoretype PKCS12 -destkeystore -deststoretype JKS e:/keystore/app.jks
openssl
OpenSSL官方文档: https://www.openssl.org/docs/manpages.html
RSA
# 1024 秘钥长度
openssl genrsa -out private.pem 1024
# 查看私钥信息
openssl rsa -in private.pem -text
###### 生成根证书 ######
## 创建根证书私钥
openssl genrsa -out root.key 1024
## 创建根证书请求文件
openssl req -new -key root.key -out root.csr
## 创建根证书
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
###### 生成客户端证书 ######
## 生成客户端证书私钥
openssl genrsa -out client.key 1024
## 生成客户端证书请求文件
openssl req -new -key client.key -out client.csr
## 生成客户端证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
## 生客户端p12格式证书,需要输入一个密码,选一个好记的,比如123456
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
SM2
openssl版本低于
1.0.1
版本不支持国密算法,Openssl1.1.1+
上版本的资源包,下载地址:https://github.com/openssl/openssl/releases
## 是否支持国密
openssl ecparam -list_curves | grep SM2
curl -o openssl-1.1.1d.tar.gz https://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar -xvf openssl-1.1.1d.tar.gz
cd openssl-1.1.1d && ./config --prefix=/usr/local/openssl && make install
## 设置openssl lib .so加载配置:
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf && ldconfig -v
## 版本输出
openssl version
国密证书
GMSSL国密试验室网站生成: https://www.gmssl.cn/gmssl/index.jsp
###### 单根证书签发用户证书流程 ###### 生成根证书
# 创建根证书私钥
openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out root.key
# 创建根证书请求文件
openssl req -new -key root.key -out root.csr -subj "/emailAddress=/CN=TXRA-CA/OU=DEVOPS/O=TXRA/L=BJ/ST=BJ/C=CN"
# 创建根证书
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
###### 单根证书签发用户证书流程 ###### 生成客户端证书
# 生成客户端证书私钥
openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out client.key
# 生成客户端证书请求文件
openssl req -new -key client.key -out client.csr -subj "/emailAddress=/CN=test1/OU=devbj/O=TXRA/L=BJ/ST=BJ/C=CN"
# 生成客户端证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
# 生客户端p12格式证书,需要输入一个密码,选一个好记的,比如123456
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -passout pass:
###### 证书链签发用户证书流程 ###### 生成根证书
# 创建根证书私钥
openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out root.key
# 创建根证书请求文件
openssl req -new -key root.key -out root.csr
# 创建根证书
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
###### 证书链签发用户证书流程 ######
###### 生成二级根证书
# 创建根证书私钥
openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out sub_root.key
# 创建根证书请求文件
openssl req -new -key sub_root.key -out sub_root.csr
# 创建根证书
openssl x509 -req -in sub_root.csr -out sub_root.crt -signkey sub_root.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
###### 生成证书链文件(p7b)
openssl crl2pkcs7 -certfile root.crt -certfile sub_root.crt -outform DER -out root.p7b -nocrl
###### 生成客户端证书(二级根证书签发用户证书)
# 生成客户端证书私钥
openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out client.key
# 生成客户端证书请求文件
openssl req -new -key client.key -out client.csr
# 生成客户端证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA sub_root.crt -CAkey sub_root.key -CAcreateserial -days 3650
# 生客户端p12格式证书,需要输入一个密码,选一个好记的,比如123456
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
1.背景
1.2 证书内容格式 ( RSA为例 )
PKCS#1
1.2.1 只是一个 RSA 密钥,即只有PKCS#8 中的密钥对象部分,前面没有版本或算法标识符。
[[私钥]]
-----BEGIN RSA PRIVATE KEY-----
base64 str,每64字节做一次换行。
-----END RSA PRIVATE KEY-----
[[公钥]]
-----BEGIN RSA PUBLIC KEY-----
base64 str,每64字节做一次换行。
-----END RSA PUBLIC KEY-----
示例:
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC9blXCZeuSuk5CpJvlyFDquyhIonRPaSlSjKYgKd9b9S0i8ubM
COPGWm+c4J48dunrXqPPUeCh4ZPtV63+7P93QMAvsR125ymeisEI9eBie0TWYoWQ
uKc5GCrIICqqe7f9DoM22tzg2h1Y7DadnOF4NZzC3CYBUzQezwyHDlxhdwIDAQAB
AoGBALMK8SXPXUwOqV+V4//YSJrEELwuSA6yj6sFYxMtYH6zCllpCjm5AUh+O9Yj
+4ucvVWI2v1eHxoCcuW2pK85Y+65pAXAyL1m0VEcz9R42MupiGekgNU2YoX0SHj5
br3D8/Jf3W0kaXvvkUsS/Hy0acRMsmBZsXK9oSX9BhI/BiU5AkEA89RhBznRDGNs
wnylWtrG/fME7ixQnS9FBCZJdskQulgaXxigWiU8CPO7JU3tafj4pk9vA3yNyiUM
DvjfWeuKVQJBAMbi26qT0C02hFB9WcmLSS2+64qSsq1ATJ/6cENkdKCU67dbOeQO
PvFJPxFfOjk0Zh/ZZKRSCCfkb7e3P3yhIJsCQD6mOBQKN/tt5HkIW9g/VFfVxFOK
EWCBz8LkL4YU3XZzwrricfkXjhhiv5gzMKhE72aUDFsh+rCQ2ktSiNjq200CQQDD
hUpGi0Hg8PNq3ZBjXpb2bfbJKCaXw9qQe3faCOvO4hhJDVoAJTEjq8pgnalzi1vK
e8FA+ZQjA6QAjBnRv+V5AkEApWk1I9wliCVJGVXjaGaFKYHI/TAL050ABDJ5M6eV
BkD4DwREVeKtoWX0KJyUdRzpuz0NZUHDYzi61mSWnu8ezQ==
-----END RSA PRIVATE KEY-----
PKCS#8
1.2.2 补充了一些相关信息,不单单只是秘钥值。其实这里可以看到,开头的RSA字眼已经消失了,因为我们能从OID中查看到(后方有图)。
[[私钥]]
-----BEGIN PRIVATE KEY-----
base64 str,每64字节做一次换行。
-----END PRIVATE KEY-----
[[公钥]]
-----BEGIN PUBLIC KEY-----
base64 str,每64字节做一次换行。
-----END PUBLIC KEY-----
示例:
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL1uVcJl65K6TkKk
m+XIUOq7KEiidE9pKVKMpiAp31v1LSLy5swI48Zab5zgnjx26eteo89R4KHhk+1X
rf7s/3dAwC+xHXbnKZ6KwQj14GJ7RNZihZC4pzkYKsggKqp7t/0Ogzba3ODaHVjs
Np2c4Xg1nMLcJgFTNB7PDIcOXGF3AgMBAAECgYEAswrxJc9dTA6pX5Xj/9hImsQQ
vC5IDrKPqwVjEy1gfrMKWWkKObkBSH471iP7i5y9VYja/V4fGgJy5bakrzlj7rmk
BcDIvWbRURzP1HjYy6mIZ6SA1TZihfRIePluvcPz8l/dbSRpe++RSxL8fLRpxEyy
YFmxcr2hJf0GEj8GJTkCQQDz1GEHOdEMY2zCfKVa2sb98wTuLFCdL0UEJkl2yRC6
WBpfGKBaJTwI87slTe1p+PimT28DfI3KJQwO+N9Z64pVAkEAxuLbqpPQLTaEUH1Z
yYtJLb7ripKyrUBMn/pwQ2R0oJTrt1s55A4+8Uk/EV86OTRmH9lkpFIIJ+Rvt7c/
fKEgmwJAPqY4FAo3+23keQhb2D9UV9XEU4oRYIHPwuQvhhTddnPCuuJx+ReOGGK/
mDMwqETvZpQMWyH6sJDaS1KI2OrbTQJBAMOFSkaLQeDw82rdkGNelvZt9skoJpfD
2pB7d9oI687iGEkNWgAlMSOrymCdqXOLW8p7wUD5lCMDpACMGdG/5XkCQQClaTUj
3CWIJUkZVeNoZoUpgcj9MAvTnQAEMnkzp5UGQPgPBERV4q2hZfQonJR1HOm7PQ1l
QcNjOLrWZJae7x7N
-----END PRIVATE KEY-----
1.3 证书文件格式
PEM 与 DER是用于存储、传输密钥和证书的标准格式,两者紧密关联,可以互相转换。
ASN.1 ------(序列化)------ DER ------(Base64编码)------ PEM
# 对 ASN.1 序列化后,就会生成一个二进制串,这个就是 DER 格式。
# 将二进制进行 Base64 编码,再加上 PEM 格式特有的头尾两行,就生成了 PEM 格式。
1.3.2 DER
类比上面的PKCS#1,Distinguished Encoding Rules,可分辩编码规则。
DER格式文件后缀通常为 .der
和 .cer
,后缀名并不会影响 DER 格式文件的解析。
1.3.1 PEM
类比上面的PKCS#8
PEM格式文件后缀通常为.pem
、.cer
、.crt
、.key
,后缀名并不会影响 PEM 格式文件的解析。
1.3.3 PEM 转 DER
- 先将 PEM 文件里面首尾的
----BEGIN xxx----
和----END xxx----
两行去掉 - 再将内容合并为一行(去掉换行符
\r\n
) - 接着将内容进行 Base64 解码
通过 openssl 命令转换如下:
openssl rsa -in rsa_private.pem -outform DER -out rsa_private.der
1.3.4 DER 转 PEM
- 先将 DER 二进制内容进行 Base64 编码
- 再按每行 64 个字节进行切分
- 最后在切分后的内容前后加上
----BEGIN xxx----
和----END xxx----
通过 openssl 命令转换如下:
openssl rsa -inform DER -in rsa_private.der -outform PEM -out rsa_private2.pem
2.RSA
2.1 私钥部分
PKCS#1
2.1.1 生成私钥:# 1024 秘钥长度
openssl genrsa -out private.pem 1024
# 查看私钥信息
openssl rsa -in private.pem -text
PKCS1
-> PKCS8
2.1.2 私钥:pem格式转der格式
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out private_pkcs8.pem
2.1.3 私钥:PKCS8 -> PKCS1
openssl rsa -in private_pkcs8.pem -out private_pkcs1.pem
2.2 公钥部分
2.2.1 导出公钥:从PKCS1私钥 导出PKCS8公钥
openssl rsa -in private_pkcs1.pem -pubout -out public_pkcs8.pem
2.2.2 导出公钥:从PKCS8私钥 导出PKCS8公钥
openssl rsa -in private_pkcs8.pem -pubout -out public_pkcs8_2.pem
PKCS8
-> PKCS1
2.2.3 公钥:openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out
# 末尾加上-out 文件名 可以写入文件
openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out -out public_pkcs1.pem
pkcs1
-> pkcs8
2.2.4 公钥:openssl rsa -in public_pkcs1.pem -pubout -RSAPublicKey_in
# 末尾加上-out 文件名 可以写入文件
openssl rsa -in public_pkcs1.pem -pubout -RSAPublicKey_in -out public_pkcs8_3.pem
2.3 扩展
2.3.1 单行私钥值format成多行
有时候配置文件里写的是单行的配置信息,想format一下,一行一行敲回车太累了。
解析ASN1结构,判断是PKCS8还是PKCS1
PKCS8带扩展信息,PKCS1不带。
根据对应的结构,添加上头尾标识字符。
比如这里添加上PKCS8的头尾信息。
[](https://markdown-1258124344.cos.ap-guangzhou.myqcloud.com/ image/202210171724790.png)
执行命令
openssl rsa -in pri.key -check # 之后它就会以PKCS1的格式输出
[
](https://markdown-1258124344.cos.ap-guangzhou.myqcloud.com/ image/202210171724901.png)
3.SM2
是否支持国密
openssl ecparam -list_curves | grep SM2
3.1 私钥部分
3.1.1 生成私钥:EC格式
# 注意此处默认生成的是ec格式,SM2是基于椭圆曲线的,一般看到EC相关的就可以认为跟SM2相关了。
openssl ecparam -genkey -name SM2 -out sm2_private_ec.key
# 查看私钥信息
openssl ec -in sm2_private_ec.key -text
3.1.2 私钥:EC -> PKCS1
openssl ec -in sm2_private_ec.key -out sm2_private_pkcs1.key
3.1.3 私钥:EC ->PKCS8
openssl pkcs8 -topk8 -inform PEM -in sm2_private_ec.key -outform pem -nocrypt -out sm2_private_pkcs8.key
PKCS1
-> PKCS8
2.1.4 私钥:从EC格式转成PKCS1/PKCS8格式后,其余的命令和RSA那里就是相通的了。
openssl pkcs8 -topk8 -inform PEM -in sm2_private_pkcs1.key -outform pem -nocrypt -out sm2_private_pkcs8_2.key
PKCS8
-> PKCS1
2.1.5 私钥:注意openssl后面的形参从rsa变成了ec
openssl ec -in sm2_private_pkcs8_2.key -out sm2_private_pkcs1_2.key
3.2 公钥部分
2.2.1 导出公钥:从EC私钥 导出PKCS8公钥
openssl ec -in sm2_private_ec.key -pubout -out sm2_public_pkcs8.key
2.2.2 导出公钥:从PKCS8私钥 导出PKCS8公钥
openssl ec -in sm2_private_pkcs8.key -pubout
# 末尾加上-out 文件名 可以写入文件
openssl ec -in sm2_private_pkcs8.key -pubout -out sm2_public_pkcs8_2.key
2.2.3 公钥:PKCS8 -> PKCS1
2.2.4 公钥:pkcs1 -> pkcs8
3.3 签名
3.3.1 PKCS1私钥进行签名
# sha1 plain.txt
openssl dgst -sign private.key -sha1 -out sm2_file.sign plain.txt
3.4 验签
3.4.1 PKCS1公钥验证签名
# sha1 plain.txt
openssl dgst -verify pub.key -sha1 -signature sm2_file.sign plain.txt
4.数字证书
4.1 查看证书序列号
openssl x509 -in xx.cer -noout -serial
4.2 获取证书中的公钥(PKCS8)
openssl x509 -in xx.cer -pubkey -noout > xx.pem