如何使用 Openssl 创建一对密钥对

如何使用 Openssl 创建一对密钥对

使用 openssl 创建一对 RSA 密钥
使用 openssl 创建一对 SM2 密钥

关于格式

  • PEMOpenssl 使用 PEM(Privacy Enhanced Mail) 格式来存放各种信息, 它是 openssl 默认采用的信息存放方式。ApacheNGINX 服务器偏向于使用这种编码格式。Openssl 中的 PEM 文件一般包含如下信息:

    • 内容类型:表明本文件存放的是什么信息内容,它的形式为 ----- BEGIN XXXX -----,与结尾的 ----- END XXXX ----- 对应;
    • 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv
    • 信息体:为 Base64 编码的数据。可以包括所有私钥(RSADSA)、公钥(RSADSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。
  • DER - 编码规则 (DER) 可包含所有私钥、公钥和证书。JavaWindows 服务器偏向于使用这种编码格式。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的, 而 PEM 是用文本报头包围的 DER

过程

  1. 生成私钥
# RSA
openssl genpkey -algorithm RSA -quiet -outform PEM -pkeyopt rsa_keygen_bits:2048 \
        -out rsa_openssl_root_certificate_private_key.pem
# SM2
openssl genpkey -algorithm EC -quiet -outform PEM -pkeyopt ec_paramgen_curve:sm2 \
        -out sm2_openssl_root_certificate_private_key.pem
  1. 利用私钥生成公钥
# RSA
openssl pkey -pubout -inform PEM -outform PEM \
        -in rsa_openssl_root_certificate_private_key.pem \
        -out rsa_openssl_root_certificate_public_key.pem
# SM2
openssl pkey -pubout -inform PEM -outform PEM \
        -in sm2_openssl_root_certificate_private_key.pem \
        -out sm2_openssl_root_certificate_public_key.pem
  1. 密钥格式转换
# RSA
openssl pkey -inform PEM -outform DER \
        -in rsa_openssl_root_certificate_private_key.pem \
        -out rsa_openssl_root_certificate_private_key.der
openssl pkey -inform DER -outform PEM \
        -in rsa_openssl_root_certificate_private_key.der \
        -out rsa_openssl_root_certificate_private_key.convert.pem

# SM2
openssl pkey -inform PEM -outform DER \
        -in sm2_openssl_root_certificate_private_key.pem \
        -out sm2_openssl_root_certificate_private_key.der
openssl pkey -inform DER -outform PEM \
        -in sm2_openssl_root_certificate_private_key.der \
        -out sm2_openssl_root_certificate_private_key.convert.pem
  1. 私钥转换成 Java 能处理的 PKCS#8 格式
# RSA
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt \
        -in rsa_openssl_root_certificate_private_key.pem \
        -out rsa_openssl_root_certificate_private_key_pkcs8.pem

# SM2
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt \
        -in sm2_openssl_root_certificate_private_key.pem \
        -out sm2_openssl_root_certificate_private_key_pkcs8.pem
  1. 私钥加密码
# RSA
openssl pkey -aes256 -passout pass:ImAPassword -inform PEM -outform PEM \
        -in rsa_openssl_certificate_private_key.pem \
        -out rsa_openssl_certificate_private_key_encipher.pem

# SM2
openssl pkey -aes256 -passout pass:ImAPassword -inform PEM -outform PEM \
        -in sm2_openssl_certificate_private_key.pem \
        -out sm2_openssl_certificate_private_key_encipher.pem
  1. 私钥去除密码
# RSA
openssl pkey -passin pass:ImAPassword -inform PEM -outform PEM \
        -in rsa_openssl_certificate_private_key_encipher.pem \
        -out rsa_openssl_certificate_private_key_decipher.pem

# SM2
openssl pkey -passin pass:ImAPassword -inform PEM -outform PEM \
        -in sm2_openssl_certificate_private_key_encipher.pem \
        -out sm2_openssl_certificate_private_key_decipher.pem
  1. 私钥改密码
# RSA
openssl pkey -passin pass:ImAPassword -aes256 -passout pass:ImAPasswordToo \
        -inform PEM -outform PEM \
        -in rsa_openssl_certificate_private_key_encipher.pem \
        -out rsa_openssl_certificate_private_key_encipher2.pem

# SM2
openssl pkey -passin pass:ImAPassword -aes256 -passout pass:ImAPasswordToo \
        -inform PEM -outform PEM \
        -in sm2_openssl_certificate_private_key_encipher.pem \
        -out sm2_openssl_certificate_private_key_encipher2.pem