天天看点

详解从p12证书提取RSA公私钥和序列号(小白向)

前言

在工作中我们或多或少会接触对接外部系统(如微信支付宝),对接过程中又无可避免会对数据的加解密和加签验签。一般第三方会提供一个授权证书,让我们自行解密提取秘钥。为了让你拿到证书后不会像我当初一样一脸懵逼,咱们来看看如何从p12证书中提取公私钥。

什么是p12证书

详解从p12证书提取RSA公私钥和序列号(小白向)

我们常说的p12证书全称是PKCS#12(Public-Key Cryptography Standards:公钥加密标准)

百度百科:

PKCS#12是一种交换数字证书的加密标准,用来描述个人身份信息。如:用户公钥、私钥、证书等。

p12证书包含了私钥、公钥并且有口令保护,在证书泄露后还有最后一道保障——证书口令,不知道正确的证书口令无法提取秘钥。​

对PKCS标准感兴趣的小伙伴可以点我打开百度百科

p12证书提取秘钥流程图

详解从p12证书提取RSA公私钥和序列号(小白向)

提取流程详解

1. 提取证书序列号

我们可能听过“公钥序列号”、“私钥序列号”等说法,这都是错误的概念,只有证书才存在序列号。

一个最简单的办法,在Windows系统下直接双击p12证书导入证书。在输入密码后看到如下提示表示证书导入成功。

详解从p12证书提取RSA公私钥和序列号(小白向)

然后Win+R打开命令行输入certmgr.msc打开

详解从p12证书提取RSA公私钥和序列号(小白向)

按如下图即可找到证书序列号,至此证书序列号获取完毕。

详解从p12证书提取RSA公私钥和序列号(小白向)
2.提取原始秘钥

我们利用OpenSSL命令提取RSA原始密钥对。

openssl pkcs12 -in 你的证书.p12 -nocerts -nodes -out rsa_origin.key
           

该秘钥内容如下:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxB/LNFITHme/a
此处省略N行
+naXDzKULrHVPtBYQkcGneZx2A2DLYBMupWI6EVw/anw9vLuhH8tVwuB77/1xQvf
4vngZlegOoSf2DQOcwU9z7A=
-----END PRIVATE KEY-----
           

提示输入证书口令后可得到原始秘钥rsa_origin.key,但仅有该秘钥是没用的,必须再从其中提取出公钥和私钥。

3.从原始秘钥提取RSA私钥

同样,利用OpenSSL命令提取RSA私钥

openssl rsa -in rsa_origin.key -out rsa_pkcs1.pem
           

提取出私钥rsa_pkcs1.pem内容如下:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsQfyzRSEx5nv2pM/Lv0FXvohs+mSnzSOhK5C44PMXoGsAGmT
此处省略N行
cEYdpIoL/QDF5zz7lFDSOvryep+g1Pp2lw8ylC6x1T7QWEJHBp3mcdgNgy2ATLqV
iOhFcP2p8Pby7oR/LVcLge+/9cUL3+L54GZXoDqEn9g0DnMFPc+w
-----END RSA PRIVATE KEY-----
           

此处注意,该秘钥为PKCS#1格式,在PHP下可直接使用,若为java环境,我们一般需要使用PKCS#8格式私钥,那么再来做一次转换。

openssl pkcs8 -topk8 -inform PEM -in rsa_pkcs1.pem -outform PEM -out rsa_private_pkcs8.pem -nocrypt
           

通过该命令我们得到java下可用的RSA私钥

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxB/LNFITHme/a
此处省略N行
+naXDzKULrHVPtBYQkcGneZx2A2DLYBMupWI6EVw/anw9vLuhH8tVwuB77/1xQvf
4vngZlegOoSf2DQOcwU9z7A=
-----END PRIVATE KEY-----
           

至此RSA私钥提取完毕。

4.从原始秘钥提取RSA公钥
openssl rsa -in rsa_origin.key -pubout -out rsa_public_key.pem
           

以上命令可提取出RSA公钥。

提示:RSA公钥不存在格式问题,可以直接使用。

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsQfyzRSEx5nv2pM/Lv0F
此处省略N行
vucXimGLR2AS6yooZg3dcELsQmQ9tsoPdKB0IlGpZwp/XPf5Gxwia/WHJzS9PMjb
bQIDAQAB
-----END PUBLIC KEY-----
           

至此RSA公钥提取完毕。

验证秘钥提取结果

我们可以使用在线RSA加解密工具,输入我们提取出的RSA公钥和私钥,在下方输入任何字符后点公钥加密,然后将密文覆盖到原文,点击私钥解密。若能得到原文说明RSA公私钥正确无误。

详解从p12证书提取RSA公私钥和序列号(小白向)
本教程同时发布在我的公众号:Java学步园,欢迎加入JAVA初级交流群:757443185,滑到最上面左侧扫描二维码哦~