本文主要是講解如何用python讀取p12
的信息。html
若是有過iOS團隊開發經驗的朋友,必定對p12
有所瞭解,由於蘋果開發者網站製做的cer證書,只能用生成上傳蘋果後臺的 CSR
(Certificate Signing Request)文件 ————CertificateSigningRequest.certSigningRequest
的macOS系統安裝使用,同時,普通我的開發帳號最多可註冊iOS Development/Distribution 證書各2個。因此,p12
就是解決在多個電腦之間共享證書的一種方式。本文不會詳解iOS證書相關知識,能夠查看本文末的參考連接。前端
在講解以前,先給你們說說原理。 p12
--- KCS12 file holds the private key and certificate. 我的信息交換(personal information exchange file)node
p12
存放了證書和私鑰,使用的是DER編碼。那什麼是DER呢? 這裏就要講講證書的知識:python
X.509
- 一種證書標準,主要定義了證書中應該包含哪些內容。其詳情能夠參考RFC5280
,SSL
使用的就是這種證書標準。算法
一樣的X.509
證書,可能有不一樣的編碼格式,目前有如下兩種編碼格式:shell
DER
- Distinguished Encoding Rules,打開看是二進制格式,不可讀.跨域
PEM
- Privacy Enhanced Mail,打開看文本格式,以"-----BEGIN..."開頭,"-----END..."結尾,內容是BASE64編碼。安全
因此,要查看p12
的內容,最好是轉換成PEM
格式。那麼這裏一種證書標準的格式,就須要實現了這種標準的工具就能解析:工具
OpenSSL
- OpenSSL是SSL
的一個實現,SSL只是一種規範。理論上來講,SSL這種規範是安全的,目前的技術水平很難破解,但SSL的實現就可能有些漏洞,如著名的"心臟出血"。OpenSSL還提供了一大堆強大的工具軟件,強大到90%咱們都用不到。因此,使用 OpenSSL
就能夠讀取p12
的信息,能夠經過如下命令把p12
轉換爲pem
:post
openssl pkcs12 -in XXX.p12 -out XXX.pem -nodes
複製代碼
執行命令後,會要求輸入p12
文件的密碼,若是密碼錯誤:Mac verify error: invalid password?
,若是密碼正確:MAC verified OK
。
示例:
p12:
pem:
因此,python 解析 p12
可使用 pyOpenSSL
,這裏就沒有什麼多說的,看代碼就好:
先安裝 pyOpenSSL
:
pip install pyOpenSSL
複製代碼
p12
文件讀取代碼:
# load OpenSSL.crypto
from OpenSSL import crypto
# open it, using password. Supply/read your own from stdin.
p12 = crypto.load_pkcs12(open("/Users/HTC/Desktop/HTC.p12", 'rb').read(), '123456')
cer = p12.get_certificate() # (signed) certificate object
pkey = p12.get_privatekey() # private key.
ca_cer = p12.get_ca_certificates() # ca chain.
print(cer, pkey, ca_cer)
print('版本', cer.get_version())
print('簽名算法', cer.get_signature_algorithm())
print('序列號:', cer.get_serial_number())
print('證書是否過時:', cer.has_expired())
print('在此以前無效:', cer.get_notBefore())
print('在此以後無效', cer.get_notAfter())
#主題名稱
subject = cer.get_subject()
s_components = subject.get_components()
print(s_components)
key_dict = {'UID': '用戶 ID',
'CN': '經常使用名稱',
'OU': '組織單位',
'O': '組織',
'C': '國家或地區'
}
for (key, value) in s_components:
print(key, value)
print(key_dict.get(key.decode(), key))
#簽發者名稱
suer = cer.get_issuer()
print(suer.get_components())
#證書擴展信息
print('擴展數:', cer.get_extension_count())
print('擴展1:', cer.get_extension(0))
複製代碼
如今 Xcode8 以後,已經能夠經過登錄開發者帳號,自動下載和管理證書,從而減小開發者配置證書遇到的各位問題,很是的方便。固然,若是是多人開發或跨域團隊,或者不想讓開發人員拿到最高權限,使用p12
仍是目前最好的方式!由於若是一個主帳號下的子帳號均可以操做證書,其實影響和安全性很難保證,因此,蘋果也有必定道理,很難在Xcode的帳號中,分權限管理吧。
關於證書,這裏只是介紹的說說p12
的簡單知識,證書體系有很是多的標準和知識,還須要多學習多實戰,加油!