什么是P12证书

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

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

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

P12证书提取秘钥流程图

https://images4.freesion.com/994/82/82033892d98408aee634d17c262b200a.png

提取流程详解

1.提取证书序列号

很多人会讲“公钥序列号”、“私钥序列号”等字眼,这都是错误的概念,只有证书才存在序列号。
一个最简单的办法,在Windows系统下直接双击p12证书导入证书。在输入密码后看到如下提示表示证书导入成功。

image

2.提取原始秘钥

我们利用OpenSSL命令提取

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

该秘钥内容如下:

1
2
3
4
5
6
7
8
-----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内容如下:

1
2
3
4
5
6
-----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私钥

1
2
3
4
5
6
-----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公私钥正确无误。
在线RSA公私钥加解密