天天看點

詳解從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,滑到最上面左側掃描二維碼哦~