跳至主要內容

JDK 自签证书

知识库运维技巧证书认证Java大约 12 分钟

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可视化工具

官方网址为 https://keystore-explorer.org/index.htmlopen in new window

证书格式

  • *.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可视化工具

官方网址为 https://keystore-explorer.org/index.htmlopen in new window

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.htmlopen in new window

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/releasesopen in new window

## 是否支持国密
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.jspopen in new window

###### 单根证书签发用户证书流程 ###### 生成根证书
# 创建根证书私钥
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为例 )

1.2.1 PKCS#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-----

1.2.2 PKCS#8

补充了一些相关信息,不单单只是秘钥值。其实这里可以看到,开头的RSA字眼已经消失了,因为我们能从OIDopen in new window中查看到(后方有图)。

[[私钥]]
-----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 格式详解open in new window

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 私钥部分

2.1.1 生成私钥:PKCS#1

# 1024 秘钥长度
openssl genrsa -out private.pem 1024

# 查看私钥信息
openssl rsa -in private.pem -text

2.1.2 私钥:PKCS1 -> PKCS8

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

2.2.3 公钥:PKCS8 -> PKCS1

openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out

# 末尾加上-out 文件名 可以写入文件
openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out -out public_pkcs1.pem

2.2.4 公钥:pkcs1 -> pkcs8

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的头尾信息。

[image-20220831150413041](https://markdown-1258124344.cos.ap-guangzhou.myqcloud.com/open in new window image/202210171724790.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

2.1.4 私钥:PKCS1 -> PKCS8

从EC格式转成PKCS1/PKCS8格式后,其余的命令和RSA那里就是相通的了。

openssl pkcs8 -topk8 -inform PEM -in sm2_private_pkcs1.key -outform pem -nocrypt -out sm2_private_pkcs8_2.key

2.1.5 私钥:PKCS8 -> PKCS1

注意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